从一道IBM的笔试题看编码规范
char* fun1() { cout<<"a"; return "1"; }
char* fun2() { cout<<"b"; return "1"; }
char* fun3() { cout<<"c"; return "1"; }
int main(int argc, char* argv[])
{
cout<<"m"<<fun1()<<fun2()<<fun3()<<endl;
return 0;
}
屏幕输出是多少?
cbam111
为什么不是abcm111呢?或者是ma1b 1c 1呢?
其实问题的实质上述同一个语句中多个表达式的执行顺序问题。对于<<其实**一般**是从右往左处理的,但实际上并没有规定顺序
cout<<fun1<<fun2<<fun3
即
operator<<(operator<<(operator<<(cout,fun1),fun2),fun3)
有点递归的感觉,第一个〈〈需要后面的结果,最后就相当于从后面开始算起
于是碰到fun()必然先输出字符,然后返回1,于是就变成了
cout<<"m"<<fun1()<<fun2()<<1;
继续往左走,直到 cout<<"m"<<1<<1<<1 ;的时候已经输出了cba,之后就是按顺序输出了m111, 所以看到的结果就是 cbam111
但是问题就在这里:这是个<<表达式。<<本来是位运算,但是这里cout却是来利用运算的“副作用”。所谓副作用,就是计算一个表达式的时候,除了得到它的值以外,对环境产生的影响都是副作用。
比如:
int a=1,b=2,c=3,d;
d=a<<b:
这一步,