新微赢技术网
标题:
[求助]关于cout的结合性
[打印本页]
作者:
阿玛比雷
时间:
2009-11-4 01:24
标题:
[求助]关于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里是不是先计算复杂表达式的值?(不过还是从右至左计算)
作者:
●.涛涛"★
时间:
2009-11-4 01:24
这个问题和结合性无关而是子表达式的计算顺序的问题。
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;
作者:
Rain
时间:
2009-11-4 01:24
也就是说依编译器的不同,其计算表达式值的顺序也各不相同?
作者:
清风
时间:
2009-11-4 01:24
的确,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
你不能说那种结果对或者不对,只能说写这些代码的人不对
当然,也不是全部的表达式元算顺序都不固定,&&,||还有条件运算符(?:)的运算顺序是固定的
作者:
ωǒ祗憙歡伱
时间:
2009-11-4 01:25
4楼说的好
欢迎光临 新微赢技术网 (http://bbs.weiying.cn/)
Powered by Discuz! X3.2