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
最后第三个表达式将增加 i
到 7
。
以上语句等同于
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++
求值。
如果我像这样使用逗号运算符编写代码:
int i;
i = 5, i++, i++;
它会调用未定义的行为吗?
没有。它不会调用未定义的行为,因为在逗号运算符的左右操作数的评估之间存在序列点。
=
的优先级高于 ,
运算符,因此 5
将绑定到 =
为
(i = 5), i++, i++;
由于逗号运算符的操作数保证从左到右求值,因此 i = 5
将首先求值,i
将被赋值 5
,然后是第二个表达式 i++
将被评估并且 i
将是 6
最后第三个表达式将增加 i
到 7
。
以上语句等同于
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++
求值。