| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1045 人关注过本帖
标题:[求助]关于cout的结合性
只看楼主 加入收藏
zzymoon
Rank: 1
等 级:新手上路
帖 子:82
专家分:1
注 册:2006-9-19
收藏
 问题点数:0 回复次数:5 
[求助]关于cout的结合性
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int a=7,b=8;
cout<<a---b<<endl<<a<<b<<endl<<a---b<<endl;
return 0;
}
在VS 2005上运行如上程序,结果为:
-2
58
-1
在VC++上运行,结果为:
-2
68
-1
???????为什么???????
<<是右结合性还是左结合性操作符?
在VS里是不是先计算复杂表达式的值?(不过还是从右至左计算)

[此贴子已经被作者于2006-12-2 16:31:42编辑过]

搜索更多相关主题的帖子: cout 结合 
2006-12-02 16:28
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
这个问题和结合性无关而是子表达式的计算顺序的问题。

cout<<a---b<<endl<<a<<b<<endl<<a---b<<endl;

除了cout和endl,一共有a---b,a,b,a---b,四个表达式
其中a---b会被理解成(a--)-b(最长符号原则)
c++没有规定这种情况下子表达式的计算顺序,而由编译器自己决定

在我的MinGW Developer Studio中输出
-1
68
-2

根据结果推算,
在VS2005中是先算后面的a---b,再算前面的a---b,之后a,至于b这里他的顺序无关紧要
在VC6中是先算后面的a---b,再算a,再算前面的a---b
在MinGW中是先算前面的a---b,再算a,再算a---b;


所以会出现上面的结果,对于这种情况最好把他们分开,改成下面的形式,就绝对不会有问题了

cout<<a---b<<endl;
cout<<a<<b<<endl;
cout<<a---b<<endl;

2006-12-02 16:58
zzymoon
Rank: 1
等 级:新手上路
帖 子:82
专家分:1
注 册:2006-9-19
收藏
得分:0 
也就是说依编译器的不同,其计算表达式值的顺序也各不相同?

程序天下,C的亡魂。 偶``````来自地狱
2006-12-02 20:20
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
的确,C++标准对复杂表达式中子表达式的求值顺序没有作硬性规定,采取什么样的求值顺序完全取决于编译器的实现,
比如下面这个例子
#include<iostream>

int main()
{
using std::cout;
using std::endl;
int i=10;
cout<<(++i)<<endl<<(i--)<<endl<<i<<endl<<(--i)<<endl<<(i++)<<endl;
return 0;
}

在VC++2005里面输出:
10
10
10
10
10

在MinGW Deleloper Studio里输出:
11
11
10
9
9

而且这种情况同样会发生在函数调用时的参数求值,例如

#include<iostream>

void func(int a,int b)
{
std::cout<<a<<std::endl;
std::cout<<b<<std::endl;
}

int main()
{
int i=10;
func(++i,--i);

return 0;
}
VC++2005输出:
10
10

而MinGW输出:
10
9

你不能说那种结果对或者不对,只能说写这些代码的人不对

当然,也不是全部的表达式元算顺序都不固定,&&,||还有条件运算符(?:)的运算顺序是固定的

2006-12-02 20:43
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以后少写在一个表达式内改变一个变量两次的代码就可以了

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-12-02 22:31
小巴
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-11-27
收藏
得分:0 
4楼说的好
2006-12-04 15:13
快速回复:[求助]关于cout的结合性
数据加载中...
 
   



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

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