LinuxSir.cn,穿越时空的Linuxsir!

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

++i 问题,今天真是糊涂了。。。

[复制链接]
发表于 2004-10-30 22:46:19 | 显示全部楼层 |阅读模式
int i=5;
printf("%d",(++i)*(++i));

请问结果是多少?

应该是49。可我总以为是7*6=42 ,很基本的问题今天竟然这样,哀。。。请帮我指导一下。
发表于 2004-10-31 11:13:56 | 显示全部楼层
i 在内存中就一个地址,怎么可能又是7又是6的呢?i 的最终值是7,所以应该是7×7=49.
发表于 2004-10-31 11:15:19 | 显示全部楼层
++和--运算符是对一行语句起作用的,你的printf("%d",(++i)*(++i));中一行有两个++,当然要先把5加两次变成7,然后再得出结果了。
发表于 2004-10-31 12:52:15 | 显示全部楼层
我觉得应该是优先级的原因,++优先级比*高,所以先算++,算完两个++,i为7,然后7*7=49
发表于 2004-10-31 17:25:13 | 显示全部楼层
大家的回答都不是很对,或者是不全面,我实验了一下:
其中,在win下的TC执行得到的结果是42
在linux下的gcc得到的是49
我想应该是编译器实现的机制不一样,对运算的顺序不一样所导致的
 楼主| 发表于 2004-10-31 17:25:27 | 显示全部楼层
谢谢上面两位!好像还与++i 本身的属性有关:先加1再使用i;i++ 是先使用i再加1。但我得不到正确结果...
 楼主| 发表于 2004-10-31 17:28:51 | 显示全部楼层
最初由 tuza 发表
i 在内存中就一个地址,怎么可能又是7又是6的呢?i 的最终值是7,所以应该是7×7=49.

按你的说法,下面的结果作何解释? i 最终值不都是7吗?为何结果不是49?
--------------------
int i=5;
printf("%d",(i++)*(i++));

结果 5*5=25
---------------------
int i=5;
printf("%d",(i++)*(++i));

结果 6*6=36
-----------------------
int i=5;
printf("%d",(++i)*(i++));

结果 6*6=36
 楼主| 发表于 2004-10-31 19:14:27 | 显示全部楼层
终于知道了!!确实象 kiron 兄说的那样,在 Turbo C上和 GCC 上的编译结果不一样!!原来是这样啊!!.....
发表于 2004-11-1 23:24:28 | 显示全部楼层
呵呵,发现我的想法确实有问题
(++i)返回的又不是i

不过这个不算什么基本问题了,这种问题知道了也没什么意义
只要知道++i和i++的区别就好了吧
发表于 2004-11-2 09:15:13 | 显示全部楼层
编译系统的问题。
有的系统自左而右顺序求解括号内的运算,得6×7。
有的则处理为7X7。
应避免出现这种歧义。
谭浩强 《c程序设计》第二版 p58
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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