- 论坛徽章:
- 0
|
原帖由 kiffa 于 2008-10-13 00:14 发表 ![]()
-> 甚至都不要試圖探究這些東西在你的編譯器中是如何實現的 (這與許多 C 教科書上的弱智練習正好相反); 正如 K&R 明智地指出, ``如果你不知道它們在不同的機器上如何實現, 這樣的無知可能恰恰會有助於保護你。 ...
3.7 我怎样才能理解复杂表达式?“序列点” 是什么?
序列点是一个时间点(在整个表达式全部计算完毕之后或在||、&&、? : 或
逗号运算符处, 或在函数调用之前), 此刻尘埃落定, 所有的副作用都已确保结束。
ANSI/ISO C 标准这样描述:
在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表
达式的计算修改一次。而且前一个值只能用于决定将要保存的值。
第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一
表达式中对该对象的访问应该只局限于直接用于计算将要写入的值。这条规则有
效地限制了只有能确保在修改之前才访问变量的表达式为合法。例如i = i+1 合
法, 而a = i++ 则非法(参见问题3.1)。
参见下边的问题3.8。
参考资料: [ISO, Sec. 5.1.2.3, Sec. 6.3, Sec. 6.6, Annex C]; [Rationale, Sec.
2.1.2.3]; [H&S, Sec. 7.12.1 pp. 228-9]。
3.1 为什么这样的代码: a = i++; 不能工作?
子表达式i++ 有一个副作用—– 它会改变i 的值—– 由于i 在同一表达式的
其它地方被引用, 这会导致无定义的结果, 无从判断该引用(左边的a 中)是旧值
还是新值。(注意, 尽管在K&R 中建议这类表达式的行为不确定, 但C 标准却强
烈声明它是无定义的, 参见问题11.32。
参考资料: [K&R1, Sec. 2.12]; [K&R2, Sec. 2.12]; [ISO, Sec. 6.3]; [H&S, Sec.
7.12 pp. 227-9]。
[ 本帖最后由 blizzard213 于 2008-10-13 00:26 编辑 ] |
|