4.1 为什么这样的代码: a[i] = i++; 不能工作?
子表达式 i++ 有一个副作用 --- 它会改变 i 的值 --- 由于 i 在同一表达式的其它地方被引用, 这会导致无定义的结果, 无从判断该引用(左边的 a[i] 中)是旧值还是新值。(注意, 尽管在 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]。
4.8 那么, 对于 a[i] = i++; 我们不知道 a[] 的哪一个分量会被改写,但 i 的确会增加 1, 对吗?
不一定!如果一个表达式和程序变得未定义, 则它的所有方面都会变成未定义。参见问题 3.2, 3.3, 11.32 和 11.35。
为什么LZ非要玩一些根本就是非法的东西呢?