一个编程小问题解释不了,大家帮忙解释下
#include<iostream>using namespace std;
int main()
{int i,j;
i=3;
j=(++i)+(++i)+(++i);
cout<<i<<' '<<j<<endl;
return 0;
}
输出结果为6,16.
6无可非议,i自加后得到,但是这个16是怎么算出来的?不是18吗?
望大虾指导! 理想的结果应该是 15 ,而不是 18。
但实际结果为什么是16呢?
看以下几种情况:
1: (++i)=4 i=4
2: (++i)+(++i)=10 i=5
3: (++i)+(++i)+(++i)=16 i=6
4: (++i)+(++i)+(++i)+(++i)=23 i=7
可见,第二种情况比我们想的多了1,其他都正常。
看另外的情况:
1: (i++)=3 i=4
2: (i++)+(i++)=6 i=5
3: (i++)+(i++)+(i++)=9 i=6
4: (i++)+(i++)+(i++)+(i++)=12 i=7
是不是完全不对?这是cl.exe version 12.0.0.8168编译器下的结果。
这是编译器在处理连续的++操作符时的错误导致的。编程不是绕口令,如果想学编程,就别看有“试题”、“考题”、“练习题”等关键字的书,如果为了计算机考试或过级,书上说什么就是什么,别管实际上是怎么样。
CSDN上高手的看法:
i=i+1 i++ ++I的区别? 请高手解释一下.
计算机内部实现过程有别,详细如下:
i=i+1的过程相当:
temp=i+1; i=temp;
i++的过程相当:
temp=i; i=temp+1; return temp;
++i的过程最简单:
i增1然后return i 的值,一步完成,没有给任何temp变量赋值:)
(无法用式子确切表达,请神灵原谅我的笨拙:) hehe ,这个问题好玩.
回复 2# 的帖子
恩,谢了二楼,你的帖子我很受益,明白了一些了,谢谢了 j=(++i)+(++i)+(++i);(3+1)+(3+1)+(3+1)=16 一看就知道C语言不过关
j=(++i)+(++i)+(++i);
++i是使用i之前使i加一,i++是使用i之后i才加一,
所以在
j=(++i)+(++i)+(++i);中
第一个括号中的i的值是4,第二个括号中的i的值是5,第三个括号中i的值是6
所以,最后i=6
j=4+5+6=16
而,如果是
j=(i++)+(i++)+(i++)的话
第一个括号中的i的值是3,第二个括号中的i的值是4,第三个括号中i的值是5
最后i=6,为什么还是6呢?因为i在这个式子中使用了三次,每次使用后都要加一,
所以最后i=6
而此时j=3+4+5=12
你可以编程看一下,看结果是不是这样!
最后回答一下你说的为什么不是18
你说是18是因为你认为最后i=6,j=6+6+6=18,其实不是这样的,
j=(++i)+(++i)+(++i);是从有到左一步一步计算的!不知道你明白没有!
还不明白就看谭浩强写的书!适合初级者! 二楼就是胡说八道!
什么理想结果?什么编译器在处理连续的++操作符时的错误导致的?
简直就是乱弹琴!
他自己写的基本都错了!
引用CSDN的倒是对的! 楼上的第8行,j=4+5+6=16
4+5+6应该是15才对啊,到底是怎么成16的呢?
还有如果是从右向左的话,应该是j=6+5+4 而不是j=4+5+6,因为是从右向左结合的!
[[i] 本帖最后由 BhackedBoy 于 2008-7-21 20:04 编辑 [/i]] 问题不是像6#所说先后自加如此简单
搂住可以不用去搞懂,这有关于编译器的问题,在不同的编译器结果不一样
回复 6# 的帖子
j=(++i)+(++i)+(++i);++i是使用i之前使i加一,i++是使用i之后i才加一,
所以在
j=(++i)+(++i)+(++i);中
第一个括号中的i的值是4,第二个括号中的i的值是5,第三个括号中i的值是6
所以,最后i=6,j=4+5+6=16
这位兄弟按你说的4+5+6=15而不是编译的结果16
我问了好多人了,的确是编译系统的问题
i++的话都是可以解释的 只是到了++i时就会出现好多千奇百怪的结果
呵呵谭浩强的那本书都是些基础问题的探讨研究,真正的好多细节问题都要我们自己去编译研究的,书上好多在编译系统不一样的情况下结果也不太一样 本人初学 看什么书比较合适!介绍本好的C++::05:: 我觉得孙鑫那本还可以,有完整视频,详情见http://www.sunxin.org 老大 一看就是数学不过关
[[[[所以,最后i=6,j=4+5+6=16]]]]
怎么得的 二楼说的跟我以前想的差不多,可是现在我这里只有编程书~~ 我已经远离网络7个多月了~~~今天出来一次很不容易,只有不到一个小时的时间上网~~除了书俺啥都没有~连X档案都要别人帮忙买~~ 我已经缺了好几期~~ 呵呵 不过我已经自学完了JAVA(以前学的是C和VB.NET),不过只有理论知识,严重缺乏实践 。 所以并不是所有的编程书都不能看的~ [quote]原帖由 [i]ximi[/i] 于 2008-7-21 16:46 发表 [url=http://bbs.hackerxfiles.net/redirect.php?goto=findpost&pid=852349&ptid=112130][img]http://bbs.hackerxfiles.net/images/common/back.gif[/img][/url]
二楼就是胡说八道!
什么理想结果?什么编译器在处理连续的++操作符时的错误导致的?
简直就是乱弹琴!
他自己写的基本都错了!
引用CSDN的倒是对的! ... [/quote]
不知道什么原因,以前没看到你的回复,现在才看到。
首先得谢谢你给我指出错误,请你不要激动,同时呢,我希望你能针对这个问题给出一个正确的解释,你也看到了,有这么多人对这个问题搞不清楚,我自己也搞不清楚,所以只能胡说八道。
理想结果,之所以要用这个词,是因为我不知道该用什么词来表达这个意思,我语文的确学得不好。
对于编译器问题,那几种情况不是我想像出来的,而是在我的C++环境下写的程序运行的结果。我承认我在语言表达上确实不准确,但你也看到了,有那么多人都认为是编译器的问题,这一点是无可厚非的。对于“(++i)+(++i)”这种情况,因为种种原因,我没有反汇编来看过到底是怎么回事,所以无法作出合理的解释,只能简单的把责任推给编译器,现在,我对我这种推卸责任的表现向大家道歉。
要说弹琴,我真的不会,你要是要一定要我弹,那我只能乱弹了。
至于CSDN上的东西,我只是原文复制过来的,作为参考而以。
[[i] 本帖最后由 编程小猪 于 2008-7-26 18:46 编辑 [/i]]
页:
[1]
