C/C++笔试系列--从一道IBM的笔试题看编码规范

本文通过分析一道IBM笔试题,探讨C/C++中表达式求值顺序的不确定性以及副作用的概念。重点在于如何避免在同一个语句中多次操作同一变量,以确保代码的可预测性和跨平台兼容性。建议使用良好的编程规范,减少对编译器优化的依赖。
摘要由CSDN通过智能技术生成

 

 

从一道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:

这一步,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值