C语言优先顺序

时间:2016-12-26 06:49:28

标签: c expression undefined-behavior evaluation

a = 5;
c = (b =a+2) - (a=1);

在书籍c编程中,现代方法由kn king编写,执行第二个语句的效果将导致6或2,因为它是c的未定义行为,但在其他书籍如c by Dennis中写的是它将从左到右执行。哪一个是正确的?

1 个答案:

答案 0 :(得分:2)

在上述情况下,

 c=(b=a+2) -(a=1);

a的值正在被更改并且在没有序列点的情况下被读取,因此它是undefined behavior

引用C11,附件§J.2,未定义的行为

  

相对于不同的副作用,对标量物体的副作用是无效的   在相同的标量对象上或使用相同标量的值进行值计算   对象

同样相关,来自章节§6.5

  

运算符和操作数的分组由语法表示。 85)除非另有说明   后来,子表达的副作用和价值计算都没有排序。 86)

因此,无法保证首先评估哪个子表达式。