c -正在编写以逗号分隔的3条指令,未定义的行为



我想我在某个地方看到用逗号,分隔多条指令是未定义的行为。

那么下面的代码会产生未定义的行为吗?

for (i=0, j=3, k=1; i<3 && j<9 && k<5; i++, j++, k++) {
    printf("%d %d %dn", i, j, k);
}

因为有3条指令由逗号,分隔:

i++, j++, k++

用逗号分隔多条指令是未定义的行为。

不,这不是一般情况。

在您的情况下,i++, j++, k++是完全有效的。

FWIW,根据C11,第6.5.17章,逗号操作符(强调我的)

逗号操作符的左操作数计算为空表达式;有一个在它的求值和右操作数的求值之间的序列点。然后右边操作数被求值;[…]


[注]:你可能会因为看到

这一行而感到困惑
  printf("%d %d %d", i++, ++i, i);

类型的语句,但请注意,这里的,并不是一个逗号操作符(而是提供参数的分隔符),并且不会进行排序。因此,这些语句 UB。

同样,参照标准,同一章的脚注3

根据语法,逗号操作符(如本子句所述)不能出现在用逗号分隔列表中的项(如函数的参数或初始化式列表)的上下文中。

你的例子是完美的C代码。

在某些情况下,逗号具有不同的含义,例如在声明语句中。在声明语句中,多个变量的声明之间用逗号隔开。

int a;
a = 1,2,3;  // Ok. a is assigned the value 3.
int a = 1,2,3;   // Not ok! 
int a = 1, b = 2; // Ok! a is assigned the value 1.

相关内容

  • 没有找到相关文章

最新更新