i = i++ 的困惑

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

前几天,中午去吃饭的时候,“指导”问了一个C++的问题:

  1. int i = 0;
  2. i = i ++;
  3. printf("%d/n", i);

输出是0还是1呢?

 

当时想了一下觉得应该是0,我的理解是“++”的优先级高于赋值,i = i ++i的值0先被读出到寄存器(如R中),然后对i进行自加操作(此时i1),最后对用寄存器Ri赋值,自加的结果被最后赋值的结果覆盖,所以结果应该为0

 

回到宿舍,用VC++6.0小试一下,出乎意料,输出居然是“1”!进入汇编调试看一下汇编代码(如图-1所示),“++”操作竟在赋值之后进行。

 

                            图-1

后来,又在DevC++5上实验得到的结果是“0”!!,查看汇编代码(如图-2所示),跟我刚开始的想法一致的。


                                                图-2

DevC++属于GCC家族的,本以为在g++4.1.2版本)里结果应该也是“0”,结果又一次出乎意料,g++输出是“1”!!!看了一下g++的编译结果(如图-3所示)。

 

                                                图-3

按照一个师兄的说法,C++标准里是说,后置“++”操作是在整条语句执行完之后才自加的。

 

DevC++的编译结果该怎么理解,后面尝试了一下:

  1. int i = 0;
  2. i = 2 + i++;
  3. printf("%d/n", i); // DevC++5、VC++6.0和g++输出都是3

上述代码的DevC++5的编译结果如图-4所示,看来DevC++5只是在“i = i++;”的情况下,自加在赋值之前完成。

 

                           图-4

最后,在java里,用sun公司提供的JDK1.6.0_06对上述两段代码进行了测试结果分别是02。应该是按运算符优先级,先自加,再赋值的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值