a = 5;
c = (b =a+2) - (a=1);
在书籍c编程中,现代方法由kn king编写,执行第二个语句的效果将导致6或2,因为它是c的未定义行为,但在其他书籍如c by Dennis中写的是它将从左到右执行。哪一个是正确的?
答案 0 :(得分:2)
在上述情况下,
c=(b=a+2) -(a=1);
a
的值正在被更改并且在没有序列点的情况下被读取,因此它是undefined behavior。
引用C11
,附件§J.2,未定义的行为
相对于不同的副作用,对标量物体的副作用是无效的 在相同的标量对象上或使用相同标量的值进行值计算 对象
同样相关,来自章节§6.5
运算符和操作数的分组由语法表示。 85)除非另有说明 后来,子表达的副作用和价值计算都没有排序。 86)
因此,无法保证首先评估哪个子表达式。