C++Primer(第五版)学习笔记——表达式基础(第四章)

个人觉得表达式只需要弄清楚几个概念:优先级、结合律、求值顺序、左值、右值和类型转换。

首先,什么是表达式?

表达式由一个或多个运算对象组成,对表达式求值将得到一个结果。

字面值和变量是最简单的表达式。

优先级和结合律:

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作用于一个结果为左值的表达式为什么会得到一个引用类型?




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值