关于C语言的简单问题

main(){
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
问什么q=22?

我在TC 2.0 下的结果。

上学时老师说过,编译环境不同,结果就不同。

个人认为:q=24 或 21

是可以理解,但等于22.想不通。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-24
不同编译器产生的结果,q值是不同的。主要有22,24两种。
22时的执行步骤:
1.先对两个相加的数进行处理,++j,++j,即得j=7
2.将两个j相加,得到14
3.14+(++j),先将++j,得到j=8
4.14+8=22

24时的执行步骤:
先将三个操作数都进行处理,即得j=8
再执行加指令,将三个数加在一起,得到24
哈哈,汇编语言的知识发挥作用了。
多赏点分哦!!!
第2个回答  2009-06-24
i++,见到就加1
++j,见到就加1
但是在同一行用多个++j会引起歧义,不同版本的编译器会给出不同的答案。
比如在我的电脑上输出是15,24,8,8。

对于您的情况,在编译器读
q=(++j)+(++j)+(++j);时,
最后一个++j先被计算,此时j=6(我们叫它jj好了);
然后是中间那个,此时j=7(我们叫它jjj);
最后是第一个++j,此时j=8(jjjj);

但是由于编译解释的缘故,我的电脑认为q=jjjj+jjjj+jjjj=8+8+8=24;

你的电脑认为q=jjjj+jjjj+jj=8+8+6=22;
第3个回答  2009-06-24
q=(++j)+(++j)+(++j);相当于q=((++j)+(++j))+(++j);注意看我加的括号了吧。
先运算((++j)+(++j))的值(这里是一个表达式,所以先求解所有的++j,知道j在这部分最终为7),即(7+7)=14,然后再加上(++j),而此时这部分表达式返回8,所以14+8=22
不同的编译器解释不一样,我上面说的是VC++6本回答被提问者采纳
第4个回答  2009-06-24
ls的正解,这个和编译器有关,用java的编译器或者gcc等又会得到不同的结果。lz还是不要在这种题目上过多费神吧,如果我遇到这种题目,我就一句话:跟编译器有关,答案不确定。
相似回答