经验分享 – 基础知识 | 每日一面(18)

读者:为什么这样的代码: a[i] = i++; 不能工作?

子表达式 i++ 有一个副作用 —– 它会改变 i 的值 —– 由于 i 在同一表达式的其它地方被引用, 这会导致无定义的结果, 无从判断该引用(左边的 a[i] 中)是旧值还是新值。(注意, 尽管在 K&R 中建议这类表达式的行为不确定, 但C标准却强烈声明它是无定义的.

读者:使用我的编译器,下面的代码 int i=7; printf(“%d\n”, i++ *i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗?

小林:尽管后缀自加和后缀自减操作符 ++ 和 — 在输出其旧值之后才会执行运算,但这里的“之后”常常被误解。没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式 “完成”之前的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。

正文完