个人觉得表达式只需要弄清楚几个概念:优先级、结合律、求值顺序、左值、右值和类型转换。
首先,什么是表达式?
表达式由一个或多个运算对象组成,对表达式求值将得到一个结果。
字面值和变量是最简单的表达式。
优先级和结合律:
C++规定了运算符的优先级和结合律,在一条复杂的表达式中,优先级高的运算符先执行,优先级相同的运算符,则按照结合律判断运算顺序(先计算右侧运算符的结果还是左侧运算符的结果)。(括号不受优先级和结合律限制):
3*2/4; // * 运算符和 / 运算符优先级相同,都满足左结合,则从左向右运算 i==1?"true":i==5?"5":"false"; //本例含有两个条件运算符,由于是右结合,会先计算第二个条件运算符的结果,并作为第一个的false结果。
翻了翻运算符优先级表,没有发现优先级相同,结合律不同的情况。
求值顺序:
什么是求值顺序?:运算符的两个或多个运算对象(表达式或函数)的求值顺序。
大部分的运算符是没有规定运算对象的求值顺序,所以,如果运算对象指向并修改了同一对象,将会引发错误并产生未定义的行为。:
int i = 0; cout<<i<<" "<<++i<<endl; //可能输出“0 1”或“1 1”或者其他形式。
四种运算符规定了求值顺序:
“&&” “||” "," "? : "
左值和右值:
这么记忆或许会好一点:
左值 -> lvalue -> location value -> 对象在内存中的位置(一个存储单元)。
右值 ->rvalue -> are value -> 对象的值。
在需要右值的地方可以用左值来代替,但是不能用右值代替左值。
如果表达式的结果是左值,decltype作用于该表达式(不是变量,变量要加括号)得到一个引用类型。(难道表达式返回的左值其实就是一个引用?)
取地址运算符生成右值。(得到的是一个地址)
int i= 0;
int *p = &i;
decltype(&p) np; //这里np的类型是int**,
本部分的问题:
地址和和指针的关系就像3 和int?所以decltype(&p)才能得到一个指针类型?
decltype作用于一个结果为左值的表达式为什么会得到一个引用类型?