如果我使用这样的逗号运算符编写代码:
int i;
i = 5, i++, i++;
是否会调用未定义的行为?
答案 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
,然后递增两次。