c语言中 经过以下几个语句为什么 count 这个变量的值是18? int i=3;int count;count=(++i)+(++i)+(++i);

c语言中 经过以下几个语句为什么 count 这个变量的值是18?
int i=3;int count;count=(++i)+(++i)+(++i);
count 的值不是,应该是15吗?

count=(++i)+(++i)+(++i);语句如何进行编译,C语言标准没有明确规定。

对于该语句,各种编译器具有不同的编译行为。

假设该语句括号内的值分别:①、②、③,(①) + (②) + (③)

    有些编译器这么算:先算(++i),i = 4,此时①的值还没算,接着算(++i),i = 5,此时②的值还没算,然后算(++i),i = 6,此时③的值还没算,最后算(++i)+(++i)+(++i),此时①②③的值算出来,① = 6,② = 6,③ = 6,相加,6 + 6 + 6,结果为18。

    有些编译器这么算:先算(++i),i = 4,此时①的值还没算,接着算(++i),i = 5,此时②的值还没算,然后算(++i)+(++i),此时①和②的值算出来,① = 5,② = 5,相加,5 + 5,然后再算(++i), i = 6,此时③的值还没算,最后算(++i)+(++i)+(++i),此时③的值算出来,③ = 6,相加,5 + 5 + 6,结果为16。

    还有编译器这么算:先算(++i),i = 4,此时①的值已经算出来了,① = 4,接着算(++i),i = 5,此时②的值已经算出来了,② = 5,然后算(++i)+(++i),此时①和②的值加起来,5 + 5,然后再算(++i), i = 6,此时③的值算出来,③ = 6,最后算(++i)+(++i)+(++i),此时①②③的值相加,4 + 5 + 6,结果为15。

有图有真相,三款编译器结果大比拼!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-13

这个问题实际上是跟编译器相关的。一楼只是说明了一个可能的情况,可能很多编译器结果是这个样子,比如VS2008。但是换一个编译器的话结果可能就不一样了,比如使用VC++6.0,结果就不会是18,有图有真相:

类似这样的问题如果真的进入工作岗位的话必须是碰不到的,如果谁在工作中这样写代码的话肯定是被批的。

第2个回答  2013-06-13

跟运算符运算优先顺序有关吧

c++我试了,结果就是18,小括号有限度最高内部全都先运算结束了才运算括号外的,于是就成了i自加三次,最后成了6+6+6,

i=3;
count=(++i)+(++i)+(++i);
cout<<count<<endl;

c#我也试过了,结果是15..似乎是从左到右依次运算(但是遇见括号依然优先),于是就成了4+5+6=15。。。。

 int k = 3,count;
 count = (++k) + (++k) + (++k);
 richTextBox1.Text = count.ToString();

以上调试皆在VS2010平台下调试完成,并且有结果显示

第3个回答  2013-06-13
具体等于多少要看编译器!!!
编译器优化方式不一样得到的结果也就不一样,你查看一下程序的汇编代码是什么样子的就知道了。18的话应该就是三次++i,i=6最后等式count=6+6+6也就是18.。
按道理来说是等于15,应该是优化等级太高了。
看反汇编代码!!!!!
第4个回答  2013-06-13
++i是前加加,就是先+1,然后在计算表达式
由于+运算符是从左到右计算
所以k=(++i)+(++i)+(++i)运算起来是这样的
第一步计算第一个(++i)
i从4变为5
这样就变成了k=5+(++i)+(++i)
第二步计算第二个(++i)
i从5变为6
这样就变成了k=5+6+(++i)
依次
k=5+6+7=18追问

i的初始值是3不是4;