Dadi 发表于 2014-2-24 19:59:42

变量自增后再来其他运算的问题

#include <stdio.h>

void main()
{
        int a=5,b=5,c,h;
        c=(a++)+(a++)+(a++);
        h=(++b)+(++b)+(b++);
        printf("%d\n%d\n%d\n%d\n",c,h,a,b);

}
结果是a=8,c=15这个我能理解
但是这h=22,b=8,这里面的h为什么是22?按道理应该是21啊,先自增一再其他运算,6+7+8=21,怎么会是22?
百思不得其解啊~

HB无影 发表于 2014-2-24 19:59:43

本帖最后由 HB无影 于 2014-2-25 16:46 编辑

编译器问题!这个小甲鱼是讲过的!
下面的图示在CS2012中编译结果和反汇编!!!

oggplay 发表于 2014-2-24 20:53:32

谁告诉你的答案:huffy: 请看正确结果:

︶ㄣ痕迹の天涯 发表于 2014-2-24 21:00:52

oggplay 发表于 2014-2-24 20:53 static/image/common/back.gif
谁告诉你的答案 请看正确结果:

我怀疑是编译器问题,C++6.0运行的结果肯定是15和22,另外楼主想问的是h=(++b)+(++b)+(++b),不是h=(++b)+(++b)+(b++);正确结果应该是18 和21 ,,,

︶ㄣ痕迹の天涯 发表于 2014-2-24 21:01:38

换个编译器,用VS试试,,,,

oggplay 发表于 2014-2-24 21:11:41

︶ㄣ痕迹の天涯 发表于 2014-2-24 21:00 static/image/common/back.gif
我怀疑是编译器问题,C++6.0运行的结果肯定是15和22,另外楼主想问的是h=(++b)+(++b)+(++b),不是h= ...

结果不是18 21的编译器该扔掉!:huffy:

394428311 发表于 2014-2-24 22:05:49

不要纠结这种问题,小甲鱼都说过了,这得看编译器,你可以学学汇编,反编译看看。

bingley 发表于 2014-2-24 22:29:37

跟编译器有关的

清明 发表于 2014-2-24 22:52:53

VS2010怎么会是这样的呢?

machimilk 发表于 2014-2-25 03:05:03





看我vs2008的结果

没必要纠结这些无聊的问题,这样写不同的编译器编译的结果很可能不同,实践中写代码也没人会这么写的,纠结这种问题好比孔乙己纠结“回”字到底有几种写法,没任何实际意义,要想知道他为什么会出现这样的结果,就转到反汇编模式看看到底这样的语句被编译器编译成什么样的机器码并执行就完全明白了,结果不在于你怎么样的代码,而是编译器怎么样编译

枫界易城 发表于 2014-2-25 12:23:11

首先对于i++的实现是:
                                             int   temp;
                                             temp   =   i;
                                             i   =   i+1;
                                             return   temp;
举个例子吧:
i=1;
j=i+++i+++i+++i+++i+++i
1. i++之前i=1所以把i++看作i
j=i+i+i+i+i+i=6
2. 计算完1.之后该执行i++
你自己数数有几个i++,5个对吧。
i=1,执行5次i++,i=6
那么同理
c=(a++)+(a++)+(a++);
即为c=a+a+a
a再自加三次
而h=(++b)+(++b)+(b++);
则为b先自加三次然后再
h=b+b+b

无念道长 发表于 2014-2-25 13:52:28


这是VC++6.0的结果,编译器不同结果有可能不同的,实在想知道,反汇编一下读读编译器怎么解析"++"的

↘_vIp`|家族_流 发表于 2014-2-25 21:36:14

本帖最后由 ↘_vIp`|家族_流 于 2014-2-25 21:38 编辑

c=5+5+5=15
h=7+7+8=22
因为刚开始时两个变量相加,所以是7+7;而不是6+7;

Dadi 发表于 2014-2-25 22:18:06

oggplay 发表于 2014-2-24 21:11 static/image/common/back.gif
结果不是18 21的编译器该扔掉!

没错······

Dadi 发表于 2014-2-25 22:21:28

枫界易城 发表于 2014-2-25 12:23 static/image/common/back.gif
首先对于i++的实现是:
                                             int   temp;
                ...

你该不会把编译错误的问题给画圆了把······

Dadi 发表于 2014-2-25 22:24:21

HB无影 发表于 2014-2-25 16:24 static/image/common/back.gif
编译器问题!这个小甲鱼是讲过的!
下面的图示在CS2012中编译结果和反汇编!!!

······
页: [1]
查看完整版本: 变量自增后再来其他运算的问题