C++
中的运算符和计算顺序
1.运算符和其优先级
优先级
|
运算符
|
结合律
|
从
高
到
低
排
列
|
( ) [ ] -> .
|
从左至右
|
! ~ ++ -- (类型)
sizeof + - * &
|
从右至左
| |
* / %
|
从左至右
| |
+ -
|
从左至右
| |
<< >>
|
从左至右
| |
<
<= > >=
|
从左至右
| |
== !=
|
从左至右
| |
&
|
从左至右
| |
^
|
从左至右
| |
|
|
从左至右
| |
&&
|
从左至右
| |
||
|
从右至左
| |
?:
|
从右至左
| |
= += -= *= /= %= &= ^= |= <<= >>=
|
从左至右
|
在C++程序设计语言中说 ++的后增(减)量(lvalue++)的优先级大于*。前增(减)量(++lvalue)和*的优先级相同。
*p++的意思是*(p++),不是(*p)++。
这样区别来对待前增量和后增量:y=++x相当于y=(x+=1),而y=x++相当于y=(t,x+=1,t)这样的区别看起来相当不错。
2
.什么是左值?
左值
(lvalue)
是可以被赋值的表达式。左值位于赋值语句的左侧,以其相对的右值(
rvaule
)
,
则位于赋值语句的右侧。每条赋值语句都必须有一个左值和一个右值。左值必须是内存中一个可存储的变量,而不能是一个常量。
左值能够存储表达式的结果:++x的结果存储在x中所以它是左值。x++的结果不是放在x中的值,所以它不是左值。
右值是不可取址的,如常量,函数返回值,类型转换结果;
int& u(); 它返回的是左值,(a=4)=28; //a=4是左值表达式。
3
.求值顺序
在一个表达式里,子表达式的求值顺序是没有定义的。特别的是,你不能假定表达式从左向右求值。 int x=f(3)+g(7) 没有定义 f(),g()哪个先调用。
int i=1; v[i]=i++;
结果也是没有定义的或者是v[1]=1,或者是v[2]=1。
但是有三种运算符的计算顺序是有定义的:逗号(,),逻辑与(&&),逻辑或(| |)。它们保证了左边的运算对象一定要先于右边的运算对象计算。如:b=(a=2,a++)计算后把3赋给b。&&只有在第一个运算对象为true时才算第二个。| |只有在第一个运算对象是false时才算第二个,这叫
短路求值。
注意区分逗号的两种用法:
f1(v[i],i++)
两个参数;
f2( (v[i],i++) )
逗号表达式;
对于f2来说参数只有一个相当于i++。