关于i++ 与 ++i 的问题

    不要再问i++++i啦!

好多人面试的喜欢问i++++i的区别。尤其是对应届毕业生面试中尤为常见。更有主考官原意出“x = 4; x = (4 + x++) + ( ++x )”这种难题,觉得这种题可以综合考察被面试者的综合能力。不排除有人,能把这种题答的很完美,但也不排除有的主考官连自己都搞不明白。

先不说这题出的对错,这种问题,在大部分(觉大部分)开发中又有多少机会会被使用到??

接着我说这种的出的是否合理。

首先介绍两个我在下面会提到的术语:

副作用(side effect):指的是在计算表达式时对某些东西(如存储变量中的值)进行修改。

顺序点(sequence point):是指程序执行过程中的一个点,在这里,进入一步之前将确保对所有的副作用都进行了评估。在C++中,语句的分号就是一个顺序点,这意味着程序处理下一条语句之前,赋值操作符、递归操作符和递减操作符执行的所有修改必须完成。

何为一个完整的表达式呢?例子有:表达式语句中的表达式部分以及用作while循环中检测条件的表达式。

顺序点有助阐明后缀递增何时进行。

现在来看下面语句:y = (4 + x++) + (6 + x++);

表达式4 + x++ 不是一个完整的表达式,因此,C++不能保证x的值计算子表达式4 + x++后立刻增加1。在这个例子中整条赋值语句是一个完整的表达式,而分号表示里顺序点,因此C++ 只能保证程序执行大下一条语句之前,x的值增加两次。C++没有规定是在计算每个表达式之后将x的值递增,还是在表达式计算完毕后才将x的值递增,有鉴于此,您应避免使用这样的表达式。

上面这种情况指的是ISO/ANSI C++标准第二版(ISO/IEC 14882:2003)。但是不同的C++编译器厂商在此基础上的标准也不同,应该说都是对这种标准的继承。

所以说这是一道毫无意义的题。


参考资料:C++ Primer Plus (第五版) 中文版 Stephen Prata 著孙建春 韦强 译。人民邮电出版社。

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值