杨开城《白话C语言》P81:
int a,b;
a = 1;
b = (++a)*(a++)+(++a);
书中原话是这样的:“由于上面对b的赋值语句中存在着3次对a的自增运算,其中有2次是左侧自增,a的初始值是1,因此先对a自增2次,a的值变为3,接着进行乘法和加法运算,b的值将是12。”
一看这话就感觉分析得太想当然了吧,VC6.0一试,b的值是7,果然不对,再用VS2005一试,b值为12。
你想老半天其计算顺序,终究还是依赖于编译器的,究其原因不过是C标准没有定义子表达式(++a)*(a++)和(++a)的计算顺序(“C将这个选择权留给实现者,这是因为可能一种选择在一种硬件上效率更高,而另一种选择在另一种硬件上效率更高。”——《C Primer Plus(第五版)》;“之所以未作定义,是想让编译器充分利用自身架构的特点,或者充分利用存储于寄存器中的值。”——《C专家编程》),真正写程序中根本不该出现这样有歧义的式子。
说白了研究这种计算题没有意义╮(╯▽╰)╭