设有 C 语言说明语句 int a=15, b=17, c;,执行表达式 c=a++ + b--; 后,结果是:c 的值为 32,a 的值为 16,b 的值为 16。理解这道题的关键,是区分后置自增、自减表达式“参与运算时的值”和“执行后变量的新值”。
逐步看表达式的计算
a++ 是后置自增:先把 a 原来的值 15 用于当前加法,再让 a 增加 1。因此,a++ 对本次加法贡献的是 15,而表达式执行后 a 变为 16。
b-- 是后置自减:先把 b 原来的值 17 用于当前加法,再让 b 减少 1。因此,b-- 对本次加法贡献的是 17,而表达式执行后 b 变为 16。
加法使用两个操作数的旧值,计算 15+17,得到 32;赋值运算再将这个结果存入 c。计算过程可以整理为下表:
| 变量或表达式 | 运算前的变量值 | 参与加法的值 | 运算后的变量值 |
|---|---|---|---|
a++ | a=15 | 15 | a=16 |
b-- | b=17 | 17 | b=16 |
c | 尚未赋值 | 15+17=32 | c=32 |
为什么不是 33,也不是 31
容易出错的地方,是看到自增、自减符号后,立即把变量的新值代入加法。这里的两个运算符都写在变量后面,所以它们是后置运算符。后置运算符先提供变量原来的值,再改变变量本身;因此,加法不会用 a 更新后的 16,也不会用 b 更新后的 16。正确的加法是 15+17,而不是 16+17 或 15+16。
也不能把题目中的后置运算符误读成前置运算符。若写成 ++a,自增后的值会参与所在表达式;若写成 --b,自减后的值会参与所在表达式。前置和后置的区别不在于变量最终是否改变——两者都会改变变量——而在于表达式本身取到的是改变前还是改变后的值。
结果汇总
整条语句 c=a++ + b--; 执行完成后,三个变量的最终状态是:
a:由 15 自增为 16;b:由 17 自减为 16;c:接收两个旧值之和,等于 32。
所以,若题目要求填写表达式结果,应答 32;若要求写出执行后的变量值,则应答 a=16、b=16、c=32。读这类 C 语言表达式时,先分别标出后置运算符提供的旧值,再计算算术结果,最后更新变量并完成赋值,就能避免把中间使用值与最终变量值混为一谈。