【发布时间】:2014-06-04 07:58:31
【问题描述】:
如果不保证子表达式的求值顺序,那为什么是正确的?
int a = 1;
a = a + 1;
这里编译器可以先计算 a 然后 a + 1 所以 a 可以是 1 或 2
而这不是:
a = a++;
这里编译器可以先计算 a 然后 a++ 儿子 a 可以是 1 或 2。
有什么区别?
【问题讨论】:
标签: c operator-precedence
如果不保证子表达式的求值顺序,那为什么是正确的?
int a = 1;
a = a + 1;
这里编译器可以先计算 a 然后 a + 1 所以 a 可以是 1 或 2
而这不是:
a = a++;
这里编译器可以先计算 a 然后 a++ 儿子 a 可以是 1 或 2。
有什么区别?
【问题讨论】:
标签: c operator-precedence
这是未定义的行为。原因如下::
§5/4 中的标准说
在上一个和下一个序列点之间,一个标量对象应该 有它的存储值修改最多一次的评估 表达。
和
只能访问先验值以确定要使用的值 存储。
这意味着,在两个序列点之间,一个变量不能被多次修改,如果一个对象被写入一个完整的表达式中,那么在同一个表达式中对它的任何和所有访问都必须直接参与计算要写入的值。
【讨论】:
阅读序列点 here ,基本上你在 2 个序列点之间有 2 个分配,这将导致未定义的行为。
a++ 将增加 a 的值,然后将其分配给 a,另一个分配将由 = 运算符完成,而 a + 1 不会更改 a 的值,您将只有2 个序列点之间的 1 个分配
【讨论】: