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;

如图c语言 图中程序中的count=0是什么意思 还有第14行count为什么要等于...
cout是记数的功能,count=0就是初始值为0.之后的count=3不能鼓励的看,看下面执行的语句,应该是三个数一行,这种输出的格式,之后再把count的值赋为0

为什么c语言中count是关键字, count是什么意思?
count在来C语言只能说是一个标识符,它即不是关键字,也不是具有特殊作用的源某个控制符。一般来说,在C语言编程中定义一个count变量或者字百面常量用于计数。比如下面的程序中用count统计度一个整数中二进制问表示中答二进制位值为1的个数。在程序设计语言中,标识符是用作程序的某一元素的名字的...

详解宏定义(#define)
因为INT1a1,b1;被宏代换后为:int*a1,b1;即定义的是一个指向int型变量的指针a1和一个int型的变量b1.而INT2a2,b2;表示定义的是两个变量a2和b2,这两个变量的类型都是INT2的,也就是int*的,所以两个都是指向int型变量的指针。 所以两者区别在于,宏定义只是简单的字符串代换,在预处理阶段完成。而typede不是...

c语言编程中count++与++count的区别
count++是指先进行运算,然后值加1,如count=5;int i=count++ \/\/此时,i=5i=count; \/\/此时 i=6而++count则是先使值加1,然后运算,如count=5;int i=++count; \/\/此时i=6;i=count; \/\/此时i=6

C语言 int i=3;-i++=?为什么呀?
这里是后缀++,表示执行表达式后i再自增1,也就是说,-i++是先执行-i,然后i再自增1 如果是-++i,则其值为-4 -i++和-++i执行后i的值都为4,它们的不同之处在于++在后面的时候是先执行别的语句再自增,++在前面则先自增再执行别的语句 ...

c语言运行以下程序段后变量a的值是:( ) int a=0, b=3;
a+b=3,a++先判断在自增,判断为0,自增后为1,因为判断为0,所以逻辑短路,后面的也就不判断了 switch里面是0,所以case 0执行成功,也就是说从case 0后面的语句都要执行,知道遇到break a++;case 1:b++;case 2:a+=b;也就是这些都有执行 所以是6 选D 不懂再问懂请采纳 ...

C(14) 若有定义:double a=22;int i=0,k=18;则不符合C语言规定的赋值语句...
C错,只有C中的%运算符运算的对象只能是整数,a为double,所以错

C语言问题,麻烦详解。 设有变量定义char a='a';int i=3,j=5,b;float
1、这种连续赋值的语句是从右往左进行计算的 y+=i-=j*=++x,就相当于 y=y*(x=x+1,x);i=i-j;y=y+i 2、逗号的运算符优先级最低,所以就想到于(a=a+i),a+j 3、括号的优先级最高 其他的具体的运算符优先级可参考书本或者网络中的讲解 ...

C语言:语句 for( i=0 ; i++<10 ; ) ; 执行结束后,变量i的值为10...
i++ 是后缀加加,在表达式里用原值,出了表达式自增1。条件 i++ < 10 可以分解成: i<10, i=i+1;所以 上面循环语句执行,可以分解成:int i;for (i=0; ;){ if (i<10) { printf("%d\\n",i); \/\/这里插一句打印语句,看看循环变量的变化 i=i+1;} else {i=i+1; break;...

C语言int i=5; i+=++i;的值是12.求具体解释
int 5;(初始化一个整数5)i+=++i;这句要拆分理解,先是左边(i+=)这个等价于i=i+(最终的i的值)然后是右边的(++i) 就是理解为i在原来基础上加上1,这种(++1)必须是加了1才能赋值给左边!因为这是赋值语句,所以右边就等于i=5+1=6 然后 就是算i+=,最终左边的值就等于i+...

相似回答