关于表达式中++,--的求值顺序(顺序点)

  1. 若一个表达式只求值,而为改变环境,就说该表达式是引用透明的(如cout<< a <);如果一个表达式求值而且改变了环境,就说该表达式有副作用(如a++)。
  2. 在C++中的运算符中,只有四种运算符规定了运算对象的运算顺序(逻辑与&&,逻辑或||,逗号运算符和条件运算符)。其他的运算符并未规定运算顺序,如f(a++,a+7,b)中的实参,并不确定a+7和a++哪一个先求值; (i++)+i +9//该表达式的值并不确定,在不用的编译器中可能不一样,因为c++没有规定+运算对象的求值顺序。(注:这里要分清结合率、优先级和求值顺序。优先级是不同的运算符之间的运算顺序;而结合律是相同的优先级时,先从哪边计算;求值顺序是,运算符两侧的运算对象的求值顺序)
  3. C++程序执行中存在一系列顺序点(时刻),语言保证一旦执行到达一个顺序点,在此之前发生的所有修改(副作用)都必须实现(必须反应到随后对同一存储位置的访问中),在此之后的所有修改都还没有发生。在顺序点之间则没有任何保证。C/C++语言定义明确定义了顺序点的概念。顺序点位于:
    (1)每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return语句的表达式,以及条件、循环和switch语句的控制表达式(for头部有三个控制表达式);
    (2)运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后
    (3)函数调用中对所有实际参数和函数名表达式(需要调用的函数也可能通过表达式描述)的求值完成之后(进入函数体之前)。
    注:
    • &&和||均有短路现象,从左往右;
    • 逗号运算符从左往右依次计算,且计算结果是最右侧的运算对象的结 果;注:当逗号表达式出现在赋值运算符右边时,要加括号;当出现在函数实参中时,也要加括号。如:a = (1,3,b++,++c); f(3,(3,5,++i),n);
    • 条件运算符(A?B:C)先计算A,若A为true,计算B并返回其结果; 若A为false计算C返回其结果(只计算B,C之一)。

    推荐阅读