很不喜欢这类题目,出这种题的,都是脑子进水的二货。
为什么这么说呢,因为这种式子,它的编译结果与编译器的实现有关。
大家都知道左++,右++的规则,但在具体使用这种代码时,很可能与你期望的结果不一致。据说,世界上超过95%的C程序员,搞不清楚这东西的运算。
所以,规则就是:不使用这种你无法预计的代码。所以我说,出这种题的老师都是混蛋。
闲话少说。
按照C语言的语法规则:这题应该先计算()中的内容,所以,应该是先计算3次--x,结果是x=6
最后再把3个()计算的结果相加,所以,最后结果应该是18,这是按照C语言语法规则得出的结论。
你说的TC中计算结果是这个,就是采用了这种规则。
另外一种说法:第1个()中计算结果是8,第2个()计算结果是7,第3个()中计算结果是6
所以,结果应该是:8+7+6 = 21。
还有一种,你想不到的计算方式:如上图中反编译结果(gcc)
粉色框中,你可以看到,编译器先进行了2次--x;的计算,然后把计算得到的结果x=7相加,得到结果14
然后再计算一次--x;此时x=6,14再加上这个6=20,这就是20的由来。(红色框)
vc6我没有反编译,但估计过程应该和这个一致。
我没有查到这样做的原因,也没有找到相关的规则说明。
只能感叹:流氓的世界我不懂!
这个规则适用更多计算式: (--x) + (--x) + (--x) + (--x) ...
实际上就相应于[(--x) + (--x)] + (--x) + (--x) ...
先运算开头2项的,然后后面一个一个的计算。
结果就是:7x2+6+5+...
很搞笑吧。
还有更搞笑的,如果把 x的类型改为 char x=9;或 int16_t x = 9;
那么,计算结果是21,发生了什么?
因为这时,编译器就按照我在上面第2种说法里的方式去编译运行了!
所以呢,你别纠结这道题为什么为选A了,再碰到老师出这种题,拿着不同的结果去打他脸!
因为这不是你的错。
tc中计算过程
x=x-1
x=x-1
x=x-1
tmp = x+x+x
result = tmp
vc中计算过程
x=x-1
x=x-1
tmp = x+x
x = x-1
result = tmp + x
这种东西不用纠结,除了考试,除了装13,没人这么用.
至于最后一张图
逗号表达式,从左到右计算,最终取值为逗号右边的表达式值
没有任何歧义的地方,自己想想吧
等下