问题在于:
使用
int a,b,c;
,a = a * b + a;
相对于(c = a * b)!=(a = c + a);
的修改等同于a
?
乍一看,我认为它们是相同的,但是规范说在expr1 != expr2
中,expr1
始终会在expr2
之前进行评估吗?我认为情况并非如此,但我无法找到明确的消息来源。
另外,我对http://en.cppreference.com/w/c/language/eval_order中的内容感到困惑:
直接赋值运算符和所有复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序。
(自C11起)
这是否意味着我可以将其解释为自C11以来上述陈述将具有固定的评估顺序(因为涉及分配),但不是在C11之前?
答案 0 :(得分:2)
(c = a * b)!=(a = c + a);
调用未定义的行为。表达式(c = a * b)
和(a = c + a)
的评估顺序未按顺序排列。
C11-6.5 / 2:
如果对标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义。[...]
报价
直接赋值运算符和所有复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序。
表示对于a = b;
或a += b
这样的表达式,在评估子表达式b
和{{}之后,会对a
到a
的分配进行排序1}}在两个陈述中。这是由C标准保证的。但是,不保证上述声明中对b
和a
的评估顺序。