C 中逗号运算符的行为

Behavior of comma operator in C

如果我像这样使用逗号运算符编写代码:

int i;
i = 5, i++, i++;

它会调用未定义的行为吗?

没有。它不会调用未定义的行为,因为在逗号运算符的左右操作数的评估之间存在序列点。

= 的优先级高于 , 运算符,因此 5 将绑定到 =

(i = 5), i++, i++;

由于逗号运算符的操作数保证从左到右求值,因此 i = 5 将首先求值,i 将被赋值 5,然后是第二个表达式 i++ 将被评估并且 i 将是 6 最后第三个表达式将增加 i7

以上语句等同于

i = 5;
i++;
i++;

No,不会调用未定义的行为,因为逗号运算符是一个序列点。 i 被赋值为 5,然后递增两次。

does it invoke undefined behavior?

不,因为逗号运算符引入了 序列点 运算符优先级 序列点 确保在对以下表达式求值之前已执行先前求值的所有副作用

序列点运算符前缀确保在i = 5, i++, i++;语句中,i将是在计算任何 i++ 表达式之前初始化

声明:

i = 5, i++, i++;

是,考虑到运算符优先级,相当于:

((i = 5), i++), i++;

因此,首先评估 (i = 5)。在它的副作用结束后(即:在i初始化5之后),下面的表达式,i++ 被评估。同样,在最后一个表达式引入的 副作用 结束后(即:i 增加 1),对最后一个表达式 i++ 求值。