- 首页 > it技术 > >
关于表达式中++,--的求值顺序(顺序点)
- 若一个表达式只求值,而为改变环境,就说该表达式是引用透明的(如
cout<< a <);如果一个表达式求值而且改变了环境,就说该表达式有副作用(如a++
)。
- 在C++中的运算符中,只有四种运算符规定了运算对象的运算顺序(逻辑与&&,逻辑或||,逗号运算符和条件运算符)。其他的运算符并未规定运算顺序,如f(a++,a+7,b)中的实参,并不确定a+7和a++哪一个先求值;
(i++)+i +9//该表达式的值并不确定,在不用的编译器中可能不一样,因为c++没有规定+运算对象的求值顺序。(注:这里要分清结合率、优先级和求值顺序。优先级是不同的运算符之间的运算顺序;而结合律是相同的优先级时,先从哪边计算;求值顺序是,运算符两侧的运算对象的求值顺序)
- 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之一)。
推荐阅读