正午阳光

初学C++,希望能得到大家的支持!
posts - 7, comments - 33, trackbacks - 0, articles - 0

问题

Posted on 2005-11-28 22:04 snake 阅读(768) 评论(18)  编辑 收藏 引用 所属分类: C++学习笔记
#include<iostream.h>
int main()
{
 int x,i=3;
 x=(++i)+(++i)+(++i);
 cout<<x<<endl;
 return 0;
}
今天从一个群里跟几个朋友讨论了一下这个程序,我感觉应该是18,可是在VC++6.0上编译的结果是16。

Feedback

# 呵呵,搞定了,写下来!  回复  更多评论   

2005-11-28 22:15 by snake
呵呵,问题搞定了,写下来!
如果i存放在一个内存空间里的化,等i完成3次自加运算后应该是6,按照一般c/c++所讲,即可得到3*=18的结果。但是VC++6.0计算出的16很奇怪,我的理解是,先进行了两次自加运算,这时i在内存中存储的值就是5,然后再进行加法5+5=10,将10先赋值给x,然后再进行第三次的++i,得到的6再和x的值10进行加法运算,将最后的16赋值给x .

# re: 不明白,先记下来  回复  更多评论   

2005-11-28 22:22 by 张沈鹏
#include<iostream>
using namespace std;
int main()
{
int x,i=3;
x=(++i)+(++i)+(++i);
cout<<x<<endl;
system("PAUSE");
return 0;
}

VC7.1
输出18

# re: 不明白,先记下来  回复  更多评论   

2005-11-28 23:16 by
那就是要看编译器了:)

# re: 不明白,先记下来  回复  更多评论   

2005-11-29 08:46 by 很土
又玩这种在工作中不允许出现的代码..........

# re: 不明白,先记下来  回复  更多评论   

2005-11-29 09:04 by nacci
同意很土的说法,我个人也不是很赞同去搞这些东西,对于语言的深入了解不在于对这些东西的研究上,反而应该尽量去避免这些东西。真要是想搞个究竟,去看看编译器生成的汇编代码就明白了。

# re: 不明白,先记下来  回复  更多评论   

2005-11-29 10:46 by 通灵王
怎么又是这个。。。。

# re: 不明白,先记下来  回复  更多评论   

2005-11-29 12:31 by socketref
编译器对于++的操作是这样的e,在一行statement之前将++(前)扫一遍,然后再进行累加
所以你的代码其实执行了
x = 6 + 6 + 6

# re: 不明白,先记下来  回复  更多评论   

2005-11-29 13:09 by 可冰
这样的代码的结果是不确定的,并没有规定;就是在不同的编译器下有不同的结果是完全合乎标准的。
况且搞这些玩意没有任何用处,不如多写写代码呢。

# re: 不明白,先记下来  回复  更多评论   

2005-11-29 16:59 by snake
谢谢以上各位的指导和批评,我会记下你们的忠告的!

# re: 不明白,先记下来  回复  更多评论   

2005-11-30 01:29 by 冰冻热狗
的确是,个人觉得能够搞懂++i和i++之类固然之好,搞不懂也罢了,如果你的项目经理看到你的源码中出现这样的代码,不知道是赞你好还是吐血好:)

# re: 不明白,先记下来  回复  更多评论   

2005-12-02 11:51 by evergreen115
在VC6中,是这样运算,

++i + ++i + ++i + ++i + ++i +...+ ++i
_______ __ __ __
|_______| | |
|_________| |
|________|


加法,乘法都一样

TC中是遵循常规的

# re: 不明白,先记下来  回复  更多评论   

2006-03-05 21:32 by DY
#include<iostream.h>
int main()
{
int x,i=3;
x=(++i)+(++i)+(++i);
cout<<x<<endl;
return 0;
}

In C++, the complier calculate the formular inside the brackets first.
i.e.
i = 3
In the 1st brackets, ++i , this time i = 4.
Then, in the 2nd brackets, remember this time i = 4, ++i, so then the value i = 5.
The 3rd brackets, at this time, i = 5, so ++i, therefore, i = 6!
Finally, add these three parts together, and then assign to x.
So, x = 4 + 5 + 6 = 16.
These the steps of C++

# re: 问题  回复  更多评论   

2006-04-04 20:03 by Sean.NET
晕……
“So, x = 4 + 5 + 6 = 16.”

这位老兄的数学还真够可以的……

VC7.1中,应该是这么定义的:
(++i) 总共有几个,就将 i 加几次,然后再相加。
比如 (++i)+(++i)+(++i) ,就是 3 个 6 相加。
(++i)+(++i) ,就是 2 个 5 相加。
(++i)+(++i)+(++i)+(++i) ,就是 4 个 7 相加。

VC6中,我就解释不来了。

# re: 问题  回复  更多评论   

2006-05-28 00:35 by sp
evergreen115正解,VC6中对这个式子的处理是前两项相加,结果再与第三项相加,故计算过程为:
++i + ++i (此时i自加了2次为5) = 5 + 5
再 10 + ++i (i再自加1次) = 10 + 6

# re: 问题  回复  更多评论   

2006-06-03 11:29 by begin
vc6 debug模式下优化参数中未打开全局优化时,依evergreen115所述可以解释.
若在debug下打开项目设定在[C++]设定做如下更改:
General->debug info:None;
Optimizations:Custiomize:选Global Optimizations或Full Optimization均可.
确定->build->Ctrl+F5->x=18

在release下无须设置x=18.


环境:xp pro&sp2&update@20060214,vc6+sp6

另:
vc7.1下debug下无此问题,x=18.

--------
五年前去金叶软件面试,考得就是这个,印象太深了,但内心觉得极无聊.



# re: 问题  回复  更多评论   

2006-08-13 13:39 by 一秋草木
1、与编译器相关。
2、这种代码在规范的编程格式中是不允许出现的。只有那些学院派喜欢考这个。

# re: 问题  回复  更多评论   

2006-09-27 13:46 by 魔法12
怎样下载C++

# re: 问题  回复  更多评论   

2009-02-25 21:31 by ma
int main()
{
int x,i=3;
x=(++i)+(++i)+(++i);
cout<<x<<endl;
return 0;
}
用我们学过的算法应该是18.出现16的结果可能是因为所用版本不一样,翻译不一样,出现16的结果

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理