打印

[原创] 一个编程小问题解释不了,大家帮忙解释下

一个编程小问题解释不了,大家帮忙解释下

#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吗?
望大虾指导!

TOP

理想的结果应该是 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变量赋值:)
  (无法用式子确切表达,请神灵原谅我的笨拙:)
以子之,攻子之矛。

TOP

hehe  ,这个问题好玩.
Hold out and you will succeed in time

TOP

回复 2# 的帖子

恩,谢了二楼,你的帖子我很受益,明白了一些了,谢谢了

TOP

j=(++i)+(++i)+(++i);
(3+1)+(3+1)+(3+1)=16

TOP

一看就知道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);是从有到左一步一步计算的!不知道你明白没有!
还不明白就看谭浩强写的书!适合初级者!

TOP

二楼就是胡说八道!
什么理想结果?什么编译器在处理连续的++操作符时的错误导致的?
简直就是乱弹琴!
他自己写的基本都错了!
引用CSDN的倒是对的!

TOP

楼上的第8行,j=4+5+6=16
4+5+6应该是15才对啊,到底是怎么成16的呢?

还有如果是从右向左的话,应该是j=6+5+4 而不是j=4+5+6,因为是从右向左结合的!

[ 本帖最后由 BhackedBoy 于 2008-7-21 20:04 编辑 ]
C++,VB,黑客X档案忠实读者。

TOP

问题不是像6#所说先后自加如此简单
搂住可以不用去搞懂,这有关于编译器的问题,在不同的编译器结果不一样

TOP

回复 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时就会出现好多千奇百怪的结果
呵呵谭浩强的那本书都是些基础问题的探讨研究,真正的好多细节问题都要我们自己去编译研究的,书上好多在编译系统不一样的情况下结果也不太一样

TOP

Processed in 0.037030 second(s), 5 queries, Gzip enabled.