LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1225|回复: 14

有意思的i=i++的问题

[复制链接]
发表于 2007-4-13 20:32:11 | 显示全部楼层 |阅读模式


  1. #include<stdio.h>
  2. int main()
  3. {
  4.    int i=10;
  5.      i=i++;
  6.     printf("%d",i);

  7.     return 0;
  8. }

复制代码


最后i 的值为几?
发表于 2007-4-13 20:34:32 | 显示全部楼层
答案是11。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-13 20:37:15 | 显示全部楼层
呵呵,你可以运行试一下.可能在不同的编译器里有不同的答案. 答案是10 与i++的实现机制有关.
回复 支持 反对

使用道具 举报

发表于 2007-4-13 20:45:34 | 显示全部楼层
VC2005是11, gcc 3.4.2是10。
晕,先翻翻gcc的源码看看。
回复 支持 反对

使用道具 举报

发表于 2007-4-13 21:27:24 | 显示全部楼层
这个问题就不用讨论了。
因为这在C++标准里面是属于unspecified behavior。

编写代码的时候要尽量避免这种类型的代码,而不是去研究各种编译器实现会得出什么结果。
回复 支持 反对

使用道具 举报

发表于 2007-4-14 01:29:27 | 显示全部楼层
这种行为未定义的代码老是有人翻出来炫。然而炫的结果就是清楚无误的告诉别人你是个绝对的新手。
回复 支持 反对

使用道具 举报

发表于 2007-4-14 07:59:45 | 显示全部楼层
gcc 4.1.2把这个答案改成11了。
回复 支持 反对

使用道具 举报

发表于 2007-4-14 11:01:45 | 显示全部楼层
不是i++的问题是编译器编译的时候生成了2个不同的变量地址罢了~~~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-14 12:11:45 | 显示全部楼层
Post by MMMIX
这种行为未定义的代码老是有人翻出来炫。然而炫的结果就是清楚无误的告诉别人你是个绝对的新手。



楼上火气蛮大的. 我本来就是新手呀.只是觉得好玩才发出来的.我倒没说我是高手之类的. 听口气,您到是高手呀.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-14 12:14:24 | 显示全部楼层
我觉得至少这样的一个问题能引发别人了解编译内部实现的问题,人总是要知道所以然的. 不能说,因为不规范就不去了解吧. 像这个问题,只有了解了,才能避免获得不想要的结果. 

后++在有些编译器中的实现类似于下面:

  1.     int tmp = a ;
  2.    a = a + 1 ;   
  3.     return tmp ;
复制代码


i++反回的值是tmp(10),把这个值又付给了i,所以i的值就是10了.

只是看到这个问题,想与大家分享一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表