我认为我在某处看到用逗号分隔的多于 1 条指令,
是未定义的行为。
那么下面的代码会产生未定义的行为吗?
for (i=0, j=3, k=1; i<3 && j<9 && k<5; i++, j++, k++) {
printf("%d %d %d\n", i, j, k);
}
因为有 3 条指令用逗号分隔,
:
i++, j++, k++
我认为我在某处看到用逗号分隔的多于 1 条指令,
是未定义的行为。
那么下面的代码会产生未定义的行为吗?
for (i=0, j=3, k=1; i<3 && j<9 && k<5; i++, j++, k++) {
printf("%d %d %d\n", i, j, k);
}
因为有 3 条指令用逗号分隔,
:
i++, j++, k++
编写多于 1 条用逗号分隔的指令是未定义的行为。
不,这不是一般情况。
在你的情况下,i++, j++, k++
是完全有效的。
FWIW,根据C11
第 §6.5.17 章,逗号运算符(强调我的)
逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;[...]
[注意]:您可能会因为看到类似的东西而感到困惑
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.