c++语句的编译译方式和i++的处理

请看以下两个函数:

例一:

Void main(int argc, char* argv[])

{

       int i=1;

       int j;

       j= (i++)+(++i);

       printf("j =%d!/n",j);

}

 

 

例二:

Void main(int argc, char* argv[])

{

       int i=1;

       i= (i++)+(++i);

       printf("i =%d!/n",i);

}

按照程序表面看,打印的结果结果应该是一样的,都应该是4

可实际上,例一中 打印的结果为 j=4;例二种 打印的结果为i=5

起初百思不得其解,赋值语句的左边对于结果应该是没有影响的,它的值都应该等于右边等式得出的结论。

而右边的等式中

n         前一个括号中为 i++i初值为1 ,则括号内值为1i变为2

n         后面一个括号中++i,由于i已经变为2 ,因此此时得到的i应该为3 ,即括号内值为3

n         因此,等式右边为1+3=4

因此,两个函数得到的结果都应该为4

 

 

后来,采用了VC++的反汇编方法,看关键步骤地汇编代码,终于知道了原因的所在:在编译的时候,整个运算采用的是自右向左的方式,而且,对于i++,他是在整个等式结束后才会作处理。

因此,以上函数的实际处理为:

n         先作右边括号中的 ++i:初值i= 1,自加,得i=2

n         作前一个括号中为 i++i值由上一步得到为2,则括号内值为2

n         2 + 2相加得到的值赋给右边的参数

n         最后,对等式中的i自加

因此,以上两个函数得到完全不同的结果。

 

 

为了论证这个结论,改变一下函数,得到函数例三

例三:

Void main(int argc, char* argv[])

{

       int i=1;

       int j;

       j= (i)+(++i);

       printf("j =%d!/n",j);

}

 

 

例三中与例一不同的是,将(i++),变为(i),最后得到的j也是4

由此证明:

1.         i++)的处理,并不是在这个运算之后自加,而确实是在整个语句执行好之后自加。

2.         编译的时候确实是自右向左编译的,否则,这个等式得到的结果为3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值