| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1871 人关注过本帖
标题:y=(++x)+(++x)+(++x)为何为是19
只看楼主 加入收藏
qianggengqiang
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-4-23
收藏
得分:0 
x的值是21
x先自加值是7
x在相加三次值是21
2005-04-24 16:03
qianggengqiang
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-4-23
收藏
得分:0 
x的值是21 x先自加值是7 x在相加三次值是21
2005-04-24 16:07
jdytz
Rank: 2
等 级:新手上路
威 望:3
帖 子:104
专家分:0
注 册:2005-4-24
收藏
得分:0 
同意19...
是内存模块中 根据"()>++"的优先1:运算++x 但是此时x仍然是变量(,,2:运算地二个++x此时第一个x结果赋值第一个变量x..3.运行++x后马上进行三个"+"加法运算赋值给y..
支持hide 的说法 ..
并不是什么错误,终究是遵循一定规律的,不要说c++没发展,是你没发展了吧~~~

``` 奔放潇洒活着我的自由
2005-04-24 17:37
雨水
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2004-10-15
收藏
得分:0 
#include <iostream.h>
void main()
{
int x(4),y;
y=(++x)+(++x)+(++x);
cout<<"y="<<y;
}
x的 初值为4 ,当运行 ++x后,结果为5 ,这时的x=5 ,结果储存在X上, 当运行到(++x)+(++x)时,x变成6 ,这时前 两个x 的和的值要存储到y 上,在这时第一个x和第二个x 相加,问题就出在这,这时 所有的x 的值都是6,所以 y为12,接下来的变化就只是后面的x ,而与前面的x的变化没关系了,因为不再参加计算,所以在加就很明白了阿!
 懂了吗?呵呵!
2005-04-25 20:58
jdytz
Rank: 2
等 级:新手上路
威 望:3
帖 子:104
专家分:0
注 册:2005-4-24
收藏
得分:0 
这个问题好像很经典的。。。没遇到过的真是不容易想象,,

``` 奔放潇洒活着我的自由
2005-04-25 23:54
白无常
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-5-5
收藏
得分:0 
hide 果然是高手!
崇拜崇拜

2005-05-05 00:30
tianykun
Rank: 4
等 级:禁止访问
威 望:11
帖 子:3727
专家分:0
注 册:2005-11-13
收藏
得分:0 

我怎么看是18的哦。。。


离开这里,离开你的视野,归隐到属于我的地方,无论何处
2006-06-24 19:00
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 

6楼和16楼说的不错,但这实际上是编译器对系统默认参数类型的快速处理导致的问题。
数学上正确的顺序是先算所有的括号,然后在按运算符优先级逐个计算,而这里的运算变成了从左起什么能算的先算,直到遇到优先级比自己高的才停止,算出优先级高的之后接着算。

这个规律不是普遍的,同样的编译器对系统自在类型是这么算,对用户定义的类型就变成了先算所有括号的方法。

楼主贴的帖子用int算得19。如果用户自己写成一个类来算结果就是18。


#include <iostream>
using namespace std;

class CTest
{
public:
CTest(int v=0) : val(v) {};
CTest operator + (CTest b){cout << \"plus \"<< endl; return CTest(val+b.val);}
CTest operator ++ (){cout << \"++\" << endl; return CTest(++val);}
int val;
};

void main()
{
CTest x(4),y(0);
y=(++x)+(++x)+(++x);
cout << \"y=\" << y.val << endl;
}



运行结果为:
++
++
++
plus
plus
y=18

过程中先作个所有的++再作+所以这种运算顺序是不能依赖的,最好分开写。


http://myajax95./
2006-06-25 02:50
Satyr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-4-7
收藏
得分:0 
晕了
关键是开始算()的
到后面就剩一个括号时是后置++
所以先看前面的和再加后面的

[此贴子已经被作者于2006-6-25 11:01:36编辑过]


C++的博大精深让我叹服
2006-06-25 10:52
Satyr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-4-7
收藏
得分:0 

#include <iostream>
using namespace std;

class CTest
{
public:
CTest(int v=0) : val(v) {};
CTest operator + (CTest b){cout << "plus "<< endl; return CTest(val+b.val);}
CTest operator ++ (int){cout << "++" << endl; return CTest(val++);}
int val;
};

void main()
{
CTest x(4),y(0);
y=(x++)+(x++)+(x++);
cout << "y=" << y.val << endl;
}
//那为什么这个不是12?


C++的博大精深让我叹服
2006-06-25 10:56
快速回复:y=(++x)+(++x)+(++x)为何为是19
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017514 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved