设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 657|回复: 4
打印 上一主题 下一主题

[求助]关于cout的结合性

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-4 01:24:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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里是不是先计算复杂表达式的值?(不过还是从右至左计算)
2#
发表于 2009-11-4 01:24:53 | 只看该作者
这个问题和结合性无关而是子表达式的计算顺序的问题。

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;
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-4 01:24:54 | 只看该作者
也就是说依编译器的不同,其计算表达式值的顺序也各不相同?
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-4 01:24:55 | 只看该作者
的确,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

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

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

使用道具 举报

5#
发表于 2009-11-4 01:25:06 | 只看该作者
4楼说的好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 23:23 , Processed in 0.117468 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表