evaluation order解决思路

evaluation order
书介绍这一章的时候(rt), 用printf(“%d %d\n", ++n, power(2, n)); 作为反例,因为在不同的compiler下会有不同的结果,不知道在++n前会不会用到power(2, n),  这个例子是没问题的,但是后面一个我有点不懂: 就是用a[i] = i++ 作为另一个反例说明计算顺序的重要性。  我觉得这地方既然++的优先性比=高,为什么会造成混乱呢? 有一个我自己的解释是:因为如果++放在i后面说明i是先被用到后被加1, 这种规则可能和优先性相违(++放在i后面即要求先=,而因为优先性又要求先=后++)。   这种解释正确嘛? 

------解决方案--------------------
引用:
所以这种混乱能用我的说法解释吗?

好像不行。这种混乱是因为 sequence point 造成的,对于各种存在先后关系的运算,标准定义了一种叫 sequence point 的时间序列点,保证在 sequence point 之前的操作一定都完成了,才能开始 sequence point 之后的任何操作。具体到 a[i] = i++; 的例子,这里只有两个 sequence points,一个是在表达式 i 和 i++ 求值与 = 之间,一个是 = 与表达式 a[i] 之间。结果就是 i 和 i++ 的求值之间不存在 sequence point,然后标准说如果对同一个 scalar object 的读与写之间不存在 sequence point,那么这造成未定义行为,即所谓的混乱。