c语言的题目,谁来解释一下这磨人的++啊啊 求详解

2025-04-22 18:05:29
推荐回答(3个)
回答1:

很不喜欢这类题目,出这种题的,都是脑子进水的二货。
为什么这么说呢,因为这种式子,它的编译结果与编译器的实现有关。
大家都知道左++,右++的规则,但在具体使用这种代码时,很可能与你期望的结果不一致。据说,世界上超过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了,再碰到老师出这种题,拿着不同的结果去打他脸!

因为这不是你的错。

回答2:

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,没人这么用.

至于最后一张图

逗号表达式,从左到右计算,最终取值为逗号右边的表达式值

没有任何歧义的地方,自己想想吧

回答3:

等下