首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

evaluation order解决思路

2013-08-04 
evaluation order书介绍这一章的时候(rt), 用printf(“%d %d\n, ++n, power(2, n)) 作为反例,因为在不同

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,那么这造成未定义行为,即所谓的混乱。

热点排行