C语言中逗号运算符的行为

时间:2017-09-14 06:28:24

标签: c comma-operator

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

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

是否会调用未定义的行为?

3 个答案:

答案 0 :(得分:5)

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

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

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

由于逗号运算符的操作数保证从左到右进行求值,因此将首先评估i = 5,并为i分配5,然后第二个表达式i++将评估后,i将为6,最后第三个表达式会将i增加到7

以上陈述相当于

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

答案 1 :(得分:5)

  

是否会调用未定义的行为?

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

序列点运算符precende 确保在i = 5, i++, i++;语句中,i初始化,然后再进行评估任何i++表达式。

声明:

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

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

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

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

答案 2 :(得分:1)

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