不要再问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 著孙建春 韦强 译。人民邮电出版社。