返回信息流☆─────────────────────────────────────☆
evengine (北邮人) 于 (Sat Nov 22 19:31:07 2008) 提到:
#include <iostream>
using namespace std;
int fun( )
{
cout << "f" ;
return 1;
}
int main()
{
int i = 1;
// cout << i++ << i++ << i++ << endl;
cout << "m" << fun() << fun() << fun() << endl;
return 1;
}
输出fffm111
cout这种连接写法的输出的执行顺序是啥呢?
☆─────────────────────────────────────☆
purevirtual (天之健|杨无敌|hf) 于 (Sat Nov 22 19:42:00 2008) 提到:
先打印出fun里的f,然后再打印出返回值1
如果你写成
cout << "m" << fun() << endl;
cout << "m" << fun() << fun() << endl;
cout << "m" << fun() << fun() << fun() << endl;
那结果就是
fm1
ffm11
fffm111
【 在 evengine (北邮人) 的大作中提到: 】
: #include <iostream>
: using namespace std;
: int fun( )
: ...................
☆─────────────────────────────────────☆
evengine (北邮人) 于 (Sat Nov 22 19:54:48 2008) 提到:
是的。确实输出是这个。
可还是不明白cout是怎么一个执行过程。cout << "m" << fun() << fun() << fun(); 为啥不是mf1f1f1
【 在 purevirtual 的大作中提到: 】
: 先打印出fun里的f,然后再打印出返回值1
: 如果你写成
: cout << "m" << fun() << endl;
: ...................
☆─────────────────────────────────────☆
purevirtual (天之健|杨无敌|hf) 于 (Sat Nov 22 20:12:24 2008) 提到:
这个应该是先把函数里的'f'字符先放到输入流里,再把m111放到流里
【 在 evengine (北邮人) 的大作中提到: 】
: 是的。确实输出是这个。
: 可还是不明白cout是怎么一个执行过程。cout << "m" << fun() << fun() << fun(); 为啥不是mf1f1f1
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Sat Nov 22 20:52:04 2008) 提到:
打屁屁。Bjarne叔叔生气了。
C++没有规定表达式的求值顺序。
☆─────────────────────────────────────☆
jazz (牧野) 于 (Sat Nov 22 21:09:14 2008) 提到:
但是这肯定是有规律的吧。。。
【 在 wks 的大作中提到: 】
: 打屁屁。Bjarne叔叔生气了。
: C++没有规定表达式的求值顺序。
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Sat Nov 22 21:49:14 2008) 提到:
cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
<<运算是左结合的。
必然先求cout<<"m"的值,值仍然是cout
然后试图求cout<<fun1()的值,这必须先求出fun1()的值。整个表达式的值仍然是cout
然后试图求cout<<fun2()的值,这必须先求出fun2()的值。整个表达式的值仍然是cout
然后试图求cout<<fun3()的值,这必须先求出fun3()的值。整个表达式的值仍然是cout
最后是cout<<endl的值,值是cout
整个表达式语句以分号结尾
注意:问题就在这里:“这必须先求出fun1()的值”,“这必须先求出fun2()的值”,“这必须先求出fun3()的值”,这3句。这是计算<<运算的前提。只要分别在计算cout<<fun1(),cout<<fun2(),cout<<fun3(),之前完成就可以了。
因此,具体是先计算fun1()的值,还是先计算fun2()的值,还是先计算fun3()的值,还是先计算cout<<"m"的值,都不影响表达式的值。
问题就在这里:
这是个<<表达式。<<本来是位运算,但是这里cout却是来利用运算的“副作用”。
所谓副作用,就是计算一个表达式的时候,除了得到它的值以外,对环境产生的影响都是副作用。
比如:
int a=1,b=2,c=3,d;
d=a<<b:
这一步,a<<b计算出1左移2位得到的结果。结果是4。也就是说,赋值表达式结束后,d的值变成4,其它地方都没有改变。这就是说这个<<运算没有副作用。
但是,cout<<"a"就不一样了。这个表达式的值我们根本就不关心。我们只关心,这个表达式“计算”完以后,"a"被输出到屏幕上了。这里“a被输出到屏幕上”就是副作用。
再看这个例子:
int foo(int a, int b) { return a+b; }
int bar(int a, int b) { return a-b; }
int a=1,b=2,c=3,d;
d=foo(a,b)+bar(b,d);
这里,foo()和bar()都没有副作用。因此,这个表达式,不论是先计算foo(a,b)的值,还是先计算bar(b,c)的值,都不会影响计算的结果。
但是,如果是这个例子:
int foo(int* a) { (*a)++; return *a;}
int bar(int* a) { (*a)--; return *a;}
int a=5,b;
b=foo(&a)+bar(&a);
这个表达式,foo()和bar()都有副作用,所以,先计算foo(&a)还是先计算bar(&a),将直接影响到b的值。
假如先计算foo,再计算bar。
首先,a=5
计算foo(&a),a变成6,foo(&a)的值是6
计算bar(&a),a变成5,bar(&a)的值是5
这样,b=6+5=11
假如先计算bar,再计算foo。
首先,a=5
计算bar(&a),a变成4,foo(&a)的值是4
计算foo(&a),a变成5,bar(&a)的值是5
这样,b=5+4=9
这就造成了计算结果不一致。
====
那。。。怎么办
一般来说,编c/c++程序有一个纪律:一个语句中不要有两个表达式有副作用。
典型的这类行为包括:b=(a++)+(a++)+(a++);
这是典型的违反这条纪律的行为。每个a++都有副作用(改变a的值)。整个表达式的值跟求值顺序直接相连。
还有就是
char* fun() { cout<<"q"; return ""; }
cout<<"m"<<fun()<<fun()<<fun()<<endl;
每个fun()都有副作用(向屏幕上显示字符)。因此效果直接与求值顺序相关。(而整个表达式的值我们根本就不关心。虽然我知道,值就是cout)。
======
在c/c++中,求值顺序是怎么样的?
不知道。
C/C++的规范中,求值顺序是不规定的。这是为了给编译器以优化的空间。
比如:
b=(a+2)+(a+2);,那么如果只计算一次a+2的值,而不是两次,那么计算量会大大降低。
因此,
不要在C语言里面做这种事情:
char* fun() { cout<<"q"; return ""; }
cout<<"m"<<fun()<<fun()<<fun()<<endl;
要这样:
char* fun() { return "q"; }
cout<<"m"<<fun()<<fun()<<fun()<<endl; // 输出的一定是 "mqqq\n"
这样更好:
string fun() { return string("q"); }
cout<<"m"<<fun()<<fun()<<fun()<<endl; // 输出的一定是 "mqqq\n"
这样就更好了:
string f="q"; // 隐式转换
cout<<"m"<<fun()<<fun()<<fun()<<endl; // 输出的一定是 "mqqq\n"
但是这样不好吗?:
cout<<"mqqq"<<endl;
这应该只是个测验。我相信IBM的软件工程师们不会编出这种垃圾代码的。
☆─────────────────────────────────────☆
guo (计忆邮心|郭) 于 (Sat Nov 22 22:02:00 2008) 提到:
这种代码也只有在笔试中会出现...
赞一下楼上
☆─────────────────────────────────────☆
derkaiser (剑痞忆秋年) 于 (Sat Nov 22 22:03:25 2008) 提到:
wks imba.....
【 在 wks (cloverprince) 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
evengine (北邮人) 于 (Sat Nov 22 22:11:23 2008) 提到:
哇塞
wks 相当赞
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
Solmyr (一直在模仿,不断被超越) 于 (Sat Nov 22 22:12:21 2008) 提到:
。。。。。。
佩服....
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
richlm (银剑山庄) 于 (Sat Nov 22 22:13:55 2008) 提到:
赞一个。。。。。。。
☆─────────────────────────────────────☆
lxin (〖冰雪猪联盟〗|玲珑冰雪猪|盟主) 于 (Sat Nov 22 23:01:51 2008) 提到:
赞~~
【 在 wks (cloverprince) 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
binuns (彬哥 * 宾纽因斯 | 单车旋风族之大黄风) 于 (Sun Nov 23 00:34:26 2008) 提到:
结合性问题
【 在 evengine 的大作中提到: 】
: #include <iostream>
: using namespace std;
: int fun( )
: ...................
☆─────────────────────────────────────☆
lighblu (莱布鲁) 于 (Sun Nov 23 00:44:03 2008) 提到:
代码稍微修改了下
#include <iostream>
using namespace std;
int fun(int i)
{
cout << "f"<<i;
return i;
}
int main()
{
int i = 1;
cout << i++ << i++ << i++ << endl;
cout << "m" << fun(1) << fun(2) << fun(3) << endl;
cin.get();
return 1;
}
输出结果:
321
f3f2f1m123
研究中。。。。额
☆─────────────────────────────────────☆
XFeng (泛舟的小猪) 于 (Sun Nov 23 03:49:20 2008) 提到:
如果只针对题来说的话,实际是这样的
cout<<"m"<<fun()<<fun()<<fun();
对于<<其实是从右往左处理的。于是碰到fun()必然先输出f,然后返回1,于是就变成了
cout<<"m"<<fun()<<fun()<<1;
继续往左走,直到 cout<<"m"<<1<<1<<1 ;的时候已经输出了fff ,之后就是按顺序输出了m111, 所以看到的结果就是 fffm111
☆─────────────────────────────────────☆
ThinkAqua (Master) 于 (Sun Nov 23 09:06:57 2008) 提到:
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
相当赞~
☆─────────────────────────────────────☆
yegle (一阁@SL小分队@lp是大牛) 于 (Sun Nov 23 09:44:26 2008) 提到:
这个解释也不错
【 在 XFeng (泛舟的小猪) 的大作中提到: 】
: 如果只针对题来说的话,实际是这样的
: cout<<"m"<<fun()<<fun()<<fun();
: 对于<<其实是从右往左处理的。于是碰到fun()必然先输出f,然后返回1,于是就变成了
: ...................
☆─────────────────────────────────────☆
jazz (牧野) 于 (Sun Nov 23 11:23:36 2008) 提到:
这个解释比较好理解,把前面的放到输出流,endl一次输出。
【 在 XFeng 的大作中提到: 】
: 如果只针对题来说的话,实际是这样的
: cout<<"m"<<fun()<<fun()<<fun();
: 对于<<其实是从右往左处理的。于是碰到fun()必然先输出f,然后返回1,于是就变成了
: ...................
☆─────────────────────────────────────☆
metal (北邮人) 于 (Sun Nov 23 11:41:45 2008) 提到:
这个楼好赞
☆─────────────────────────────────────☆
xiaokaimail (King) 于 (Sun Nov 23 12:49:14 2008) 提到:
学习了啊~~~赞
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Sun Nov 23 13:09:31 2008) 提到:
正解。
【 在 wks 的大作中提到: 】
: 打屁屁。Bjarne叔叔生气了。
: C++没有规定表达式的求值顺序。
☆─────────────────────────────────────☆
LInd (贱贱贱贱贱贱贱贱贱贱贱凹凸曼||兄弟会) 于 (Sun Nov 23 14:25:57 2008) 提到:
赞6L
☆─────────────────────────────────────☆
odark (odark) 于 (Sun Nov 23 14:29:43 2008) 提到:
受教了。。。
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Sun Nov 23 14:43:08 2008) 提到:
又看了看wks的解释 ,感觉对于本题的解释不太对,虽然wks对c++没有规定运算顺序的解释是正确的,但是本题考的要点大概不再这里。
cout << "m" << fun() << fun() << fun() << endl;
这句中,cout是个对象,该对象调用了重载操作符<<,那么,执行的方式就与<<全局普通操作符号不同。举个例子:
class A
{
public:
A& operator + (int){printf("A");return *this;}
};
int fun( )
{
cout << "f" ;
return 1;
}
int fun1( )
{
cout << "f1" ;
return 1;
}
int main()
{
A a1,a4;
int a = 10, b = 2;
a = b + printf("%d",a) + fun() + fun1(); //(1)普通算术运算符+号;
a4 = a1 + printf("%d",a) + fun() + fun1(); // (2)重载的+号;
return 1;
}
(1)的汇编代码如下:
00401266 mov edx,dword ptr [ebp-14h]
00401269 push edx
0040126A push offset string "%d" (00432024)
0040126F call printf (00408f50)
00401274 add esp,8
00401277 mov esi,dword ptr [ebp-18h]
0040127A add esi,eax
0040127C call @ILT+120(fun) (0040107d)
00401281 add esi,eax
00401283 call @ILT+80(fun1) (00401055)
00401288 add esi,eax
0040128A mov dword ptr [ebp-14h],esi
可以看到,三个函数的调用顺序依次为printf,fun,fun1;也就是说,这个很好的依照了c++规定的+号自左向右的结合顺序。
再看(2)的汇编代码:
0040122D call @ILT+80(fun1) (00401055)
00401232 push eax
00401233 call @ILT+120(fun) (0040107d)
00401238 push eax
00401239 mov eax,dword ptr [ebp-14h]
0040123C push eax
0040123D push offset string "%d" (00432024)
00401242 call printf (00408f50)
00401247 add esp,8
0040124A push eax
0040124B lea ecx,[ebp-4]
0040124E call @ILT+25(A::operator+) (0040101e)
00401253 mov ecx,eax
00401255 call @ILT+25(A::operator+) (0040101e)
0040125A mov ecx,eax
0040125C call @ILT+25(A::operator+) (0040101e)
00401261 mov cl,byte ptr [eax]
00401263 mov byte ptr [ebp-10h],cl
可以看到,三个函数的调用顺序依次为fun1,fun,printf;这种情况下,这三个函数的调用次序,是不定的,也就是说C++标准并没有规定,而是编译器相关的。见后面总结第3条。
由于是对象的重载+操作符,所以上来就先计算出来三个调用函数的值,然后再调用+操作符函数进行自左至右的运算。这个像什么?是不是像将函数返回值作为实参传给另一个函数的形参?对的,所以这种行为的解释就是:对于函数调用的重载操作符函数,该操作符函数将后面的整体作为参数来看待。
拿cout << "m" << fun() << fun() << fun() << endl; 来说:
由于<<是cout的重载操作符,那么在这种情况下,编译器会将该语句中所有的函数进行调用,全部调用完后,才会调用<<重载操作符,将所有函数返回值进行从左至右进行打印。
这种对于重载操作符的特殊处理,我在c++标准里没有查到,可能也是没有明确规定的,由编译器自行实现的。
最后总结一下:
1 一条语句的结果由三条要素决定:符号优先级,运算对象结合顺序,运算顺序。
2 c++标准只规定了符号优先级和运算对象结合顺序,而没有规定运算顺序。所以,运算顺序是于编译器相关的,比如vc6是从左至右,Turbo C是从右至左。比如a[++i] = i++,其结果是不确定的。
3 C++标准规定:函数的参数的计算顺序也是不定的,比如printf("%d,%d",i++,j++);那么先执行i++还是j++,是不确定的。也比如上面的fun1,fun,printf;调用次序。
4 C++标准规定:类重载的运算符,并不会改变该运算符的符号优先级,运算对象结合顺序,但是编译器会在调用类重载运算符时,可能做一些标准没有规定的改动,这并不会违反规范。
5 最后,这道ibm的题考了c++规范没有规定的,也就是并不规范,结果不确定的东西,所以个人认为这道题出得不好。
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
liyy (酸奶真好喝~) 于 (Sun Nov 23 15:06:47 2008) 提到:
啊,学习了~~
☆─────────────────────────────────────☆
XFeng (泛舟的小猪) 于 (Sun Nov 23 15:56:29 2008) 提到:
【 在 cymvp 的大作中提到: 】
: 又看了看wks的解释 ,感觉对于本题的解释不太对,虽然wks对c++没有规定运算顺序的解释是正确的,但是本题考的要点大概不再这里。
: cout << "m" << fun() << fun() << fun() << endl;
: 这句中,cout是个对象,该对象调用了重载操作符<<,那么,执行的方式就与<<全局普通操作符号不同。举个例子:
: ...................
由于三个fun()的输出是一样的,虽然c++标准只规定了符号优先级和运算对象结合顺序,而没有规定运算顺序, 但是这道题和这个没什么关系, 结果只能有一个,所以还是合理的
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Sun Nov 23 16:24:10 2008) 提到:
所谓没有标准规定,就是说结果不是只有一个,你用的编译器可能会是这个,别的编译器结果可能就不是这个
【 在 XFeng 的大作中提到: 】
: 由于三个fun()的输出是一样的,虽然c++标准只规定了符号优先级和运算对象结合顺序,而没有规定运算顺序, 但是这道题和这个没什么关系, 结果只能有一个,所以还是合理的
☆─────────────────────────────────────☆
chaizhaohang (漆黑之牙) 于 (Sun Nov 23 16:36:13 2008) 提到:
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
被整晕了
☆─────────────────────────────────────☆
ayu (来世做流氓) 于 (Sun Nov 23 17:15:39 2008) 提到:
wks大牛啊
☆─────────────────────────────────────☆
linuxapp (linux系统及应用) 于 (Sun Nov 23 17:40:35 2008) 提到:
这个要re一下
【 在 cymvp 的大作中提到: 】
: 又看了看wks的解释 ,感觉对于本题的解释不太对,虽然wks对c++没有规定运算顺序的解释是正确的,但是本题考的要点大概不再这里。
: cout << "m" << fun() << fun() << fun() << endl;
: 这句中,cout是个对象,该对象调用了重载操作符<<,那么,执行的方式就与<<全局普通操作符号不同。举个例子:
: ...................
☆─────────────────────────────────────☆
rhts (albion) 于 (Sun Nov 23 18:07:01 2008) 提到:
【 在 evengine 的大作中提到: 】
: #include <iostream>
: using namespace std;
: int fun( )
: ...................
赞~
☆─────────────────────────────────────☆
kmplayer (就是喜欢她) 于 (Sun Nov 23 18:10:20 2008) 提到:
越看越迷茫.
☆─────────────────────────────────────☆
lanphon (灌水协会副主席|灌水帮少帮主 嗯) 于 (Sun Nov 23 18:13:18 2008) 提到:
我是来赞ID的
【 在 kmplayer (就是喜欢她) 的大作中提到: 】
: 越看越迷茫.
☆─────────────────────────────────────☆
XFeng (泛舟的小猪) 于 (Sun Nov 23 18:32:41 2008) 提到:
【 在 cymvp 的大作中提到: 】
: 所谓没有标准规定,就是说结果不是只有一个,你用的编译器可能会是这个,别的编译器结果可能就不是这个
你的意思就是说 IBM这道题里的三个fun()的调用顺序 根据编译器的不同 是不一定的呗~ 但是这道题这三个fun()无论顺序如何,输出结果都是一样的。
☆─────────────────────────────────────☆
linuxapp (linux系统及应用) 于 (Sun Nov 23 19:14:40 2008) 提到:
在这个题里,结果的确都一样
不知道考这个题是什么意义呢
【 在 XFeng 的大作中提到: 】
: 你的意思就是说 IBM这道题里的三个fun()的调用顺序 根据编译器的不同 是不一定的呗~ 但是这道题这三个fun()无论顺序如何,输出结果都是一样的。
☆─────────────────────────────────────☆
cymvp (cymvp) 于 (Sun Nov 23 19:49:00 2008) 提到:
那么是先输出"m",还是先输出“f”呢?这就不一样了
【 在 XFeng 的大作中提到: 】
: 你的意思就是说 IBM这道题里的三个fun()的调用顺序 根据编译器的不同 是不一定的呗~ 但是这道题这三个fun()无论顺序如何,输出结果都是一样的。
☆─────────────────────────────────────☆
Materazzi (㊣猪猪楼下素猪联盟㊣马特拉齐♂) 于 (Sun Nov 23 19:52:18 2008) 提到:
赞~
☆─────────────────────────────────────☆
XFeng (泛舟的小猪) 于 (Sun Nov 23 21:49:01 2008) 提到:
【 在 cymvp 的大作中提到: 】
: 那么是先输出"m",还是先输出“f”呢?这就不一样了
[em68] 恩,对~~ 受教
☆─────────────────────────────────────☆
ppbupter (Growing) 于 (Sun Nov 23 22:42:08 2008) 提到:
哇 赞 赞 赞~~
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Sun Nov 23 23:49:27 2008) 提到:
回来囧一下
☆─────────────────────────────────────☆
lishuaigirl (李) 于 (Mon Nov 24 09:40:38 2008) 提到:
wks很好很强大!
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Mon Nov 24 10:48:43 2008) 提到:
姐姐好~
【 在 lishuaigirl 的大作中提到: 】
: wks很好很强大!
☆─────────────────────────────────────☆
tuolingsheng (fish) 于 (Mon Nov 24 14:36:03 2008) 提到:
cout的输出是先从右往左读入缓冲区,再从左往右输出;
☆─────────────────────────────────────☆
kowizards (聂风) 于 (Mon Nov 24 17:53:59 2008) 提到:
真正的高手!!!!!!!!!!!!!!!!
听您一句话恍然大悟。
就是没想到女孩子编程也这么牛!
【 在 tuolingsheng 的大作中提到: 】
: cout的输出是先从右往左读入缓冲区,再从左往右输出;
☆─────────────────────────────────────☆
zhangjw (阿爸) 于 (Mon Nov 24 18:03:52 2008) 提到:
各种人,各种牛
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Mon Nov 24 19:02:26 2008) 提到:
服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了
【 在 tuolingsheng 的大作中提到: 】
: cout的输出是先从右往左读入缓冲区,再从左往右输出;
☆─────────────────────────────────────☆
lxin (〖冰雪猪联盟〗|玲珑冰雪猪|盟主) 于 (Mon Nov 24 19:07:25 2008) 提到:
(-_-メ)
【 在 wks (cloverprince) 的大作中提到: 】
: 服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服了服
☆─────────────────────────────────────☆
lgsh (kawaii) 于 (Mon Nov 24 19:43:28 2008) 提到:
好羡慕啊~~~~
【 在 wks 的大作中提到: 】
: cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
: <<运算是左结合的。
: 必然先求cout<<"m"的值,值仍然是cout
: ...................
☆─────────────────────────────────────☆
suyulin (Doomer) 于 (Mon Nov 24 22:23:31 2008) 提到:
imba
☆─────────────────────────────────────☆
Dylan (貌似故来人) 于 (Mon Nov 24 22:44:39 2008) 提到:
哎,二选一猜错了。
☆─────────────────────────────────────☆
ssailing (sailing) 于 (Tue Nov 25 01:13:51 2008) 提到:
大牛,从汇编级解释问题更让人信服
问题的本质还是编译器解释优化的问题,因此可能带来差异
如果ibm不是为了考编码规范的话,那么这个题是个失败
所以为了全面,我们可以写上多个答案,并说明为什么有这种差异
其实要获得统一的结果狠简单,保持良好的编码规范
对复杂的语句进行分拆,尽量一个语句只进行一种操作
【 在 cymvp 的大作中提到: 】
: 又看了看wks的解释 ,感觉对于本题的解释不太对,虽然wks对c++没有规定运算顺序的解释是正确的,但是本题考的要点大概不再这里。
: cout << "m" << fun() << fun() << fun() << endl;
: 这句中,cout是个对象,该对象调用了重载操作符<<,那么,执行的方式就与<<全局普通操作符号不同。举个例子:
: ...................
☆─────────────────────────────────────☆
gregory (Yuri) 于 (Tue Nov 25 10:39:01 2008) 提到:
【 在 cymvp 的大作中提到: 】
: 又看了看wks的解释 ,感觉对于本题的解释不太对,虽然wks对c++没有规定运算顺序的解释是正确的,但是本题考的要点大概不再这里。
: cout << "m" << fun() << fun() << fun() << endl;
: 这句中,cout是个对象,该对象调用了重载操作符<<,那么,执行的方式就与<<全局普通操作符号不同。举个例子:
: ...................
这个太猛了
汇编。。。解释很到位
赞下
同一函数输出是确定的
☆─────────────────────────────────────☆
skystar (!~改~···) 于 (Tue Nov 25 20:44:41 2008) 提到:
介绍得挺详细 不过还是不怎么理解 囧
☆─────────────────────────────────────☆
kevinew (132|合鸟) 于 (Tue Nov 25 23:07:14 2008) 提到:
cout , 类似于树里面
从右往左的后序遍历 。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #17158同步于 2008/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[合集] 下午ibm的笔试题
Xer
2008/12/6镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。