1 副作用和顺序点
首先,副作用指的是在计算机表达式时对某些东西(如存储在变量中的值)进行了修改;顺序点是程序执行过程中的一个点,在这里,进入下一步之前将确保对所有的副作用都进行了评估。在C++中,语句中的分号就是一个顺序点,这意味着程序处理下一条语句之前,赋值运算符、递增运算符和递减运算符执行的所有修改都必须完成。另外,任何完整的表达式末尾都是一个顺序点。
何为完整表达式呢?他是这样一个表达式:不是另一个更大表达式的子表达式。完整表达式的例子有:表达式语句中的表达式部分以及用作while循环中检测条件的表达式。
2 前缀格式和后缀格式
如果使用前缀格式或者后缀格式作用于变量,变量被用于某些目的(如用作函数参数或者给变量赋值),使用前缀格式和后缀格式的结果是不同的。然而,如果递增表达式的值没有使用,那二者结果没有区别。
x++;
++x;
这从逻辑上说,在上述情况下,使用前缀格式和后缀格式没有任何区别。表达式的值未被使用,因此只有副作用。然而,虽然选择使用前缀表达式还是后缀表达式对程序的行为没有影响,但执行速度可能有细微的差别,对于内置类型和当地的编译器而言,这看似不是什么问题。然而,C++允许您针对类定义这些运算符,在这种情况下,用户这样定义前缀函数:将值加1,然后返回结果;但后缀版本复制一个副本,将其加1,然后将复制的副本返回,因此,对于类而言,前缀版本的效率比后缀版本高。