【重学《C++Primer第四版》】第五章、表达式

Details of knowledge
1.养成使用自增自减前置操作符这个好习惯(性能比较高)。
前置操作符:只需加1后返回加1后的结果即可。

后置操作符:必须保存操作数原来的值,以便返回未加1之前的值作为操作的结果


2.解引用优先级低于点操作符。
*sp.foo;是先执行sp.foo,而不是*sp。


Questionable Examples
1.char *cp="Hello World";while(cp&&*cp);

这个while循环的条件cp&&*cp的意思就是cp不是空指针并且cp指向的串不是空串。


2.iter++->empty()合法
for(vector<string>::iterator it=v.begin();it!=v.end();)
{
cout<<it++->empty()<<endl;
}
代码会输出vector中每一个元素是否是空串。

iter++->empty()的执行顺序时iter先++然后返回iter的原值并且测试原值是否为空。


3. int x[10];
int *p=x;
cout<<sizeof(x)<<" "<<sizeof(*x)<<endl;//输出结果为40 4
cout<<sizeof(p)<<" "<<sizeof(*p)<<endl;//输出结果为4 4

对数组名进行sizeof操作得到的结果是整个数组的大小,p是一个整形指针,*p和*x一样都是指向数组首元素的整形指针


4.操作符的优先级记忆

操作符的优先级

操作符及其结合性

功能

用法

L

L

L

::

::

::

全局作用域

类作用域

名字空间作用域

:: name

calss :: name

namespace :: name

L

L

L

L

L

.

->

[]

()

()

成员选择

成员选择

下标

函数调用

类型构造

object.member

pointer->member

variable[expr]

name(expr_list)

type(expr_list)

R

R

R

R

R

++

--

Typeid

Typeid

显式强制类型转换

后自增操作

后自减操作

类型ID

运行时类型ID

类型转换

Lvalue++

Lvalue—

Typeid(type)

Typeid(expr)

Cast_name<type>(expr)

R

R

R

R

R

R

R

R

R

R

R

R

R

R

Sizeof

Sizeof

++

--

~

!

-

+

*

&

()

New

Delete

Delete []

对象的大小

类型的大小

前自增操作

前自减操作

位求反

逻辑非

一元负号

一元正号

解引用

取地址

类型转换

创建对象

释放对象

释放数组

Sizeof expr

Sizeof(type)

++lvalue

--lvalue

~expr

!expr

-expr

+expr

*expr

&expr

(type)expr

New type

Delete expr

Delete []expr

L

L

->*

.*

指向成员操作的指针

指向成员操作的指针

Ptr->*ptr_to_member

Obj.*ptr_to_member

L

L

L

*

/

%

乘法

除法

求模(求余)

Expr * expr

Expr / expr

Expr % expr

L

L

+

-

加法

减法

Expr + expr

Expr - expr

L

L

<< 

>> 

位左移

位右移

Expr << expr

Expr >> expr

L

L

L

L

<=

>=

小于

小于等于

大于

大于等于

Expr < expr

Expr <= expr

Expr > expr

Expr >= expr

L

L

==

!=

相等

不等

Expr == expr

Expr != expr

L

&

位与

Expr & expr

L

^

位异或

Expr ^ expr

L

|

位或

Expr | expr

L

&&

逻辑与

Expr && expr

L

||

逻辑或

Expr || expr

R

? :

条件操作

Expr ? expr : expr

R

R

R

R

R

=

*= , /= , %=,

+= , -=,

<<= , >>= ,

&= , |= , ^=

赋值操作

复合赋值操作

Lvalue = expr

Lvalue += expr等等

R

Throw

抛出异常

Throw expr

L

,

逗号

Expr, expr

记忆方法:

初等单目一二级, // 初等运算符和单目运算符分别是第1、2优先级
乘除求余加减移, // 这句里面的运算符全归为算术运算符,移表示移位
关系等于不等于, // 关系运算符(<  <=  >  >=)
按位与来异或或, // 位运算符优先级顺序: & -> ^ -> |
逻辑与或条件弱, // 逻辑运算符优先级顺序: && -> ||,后面跟着优先级比较低(弱)的条件运算符

赋值逗号一点破。 // 赋值,逗号最低


5.采用不同初始化方式有显著的差别
int *p=new int;//pi指向一个未初始化的int

int *p=new int();//pi指向int型变量0(初始化为0)


6.如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。


Concrete Explanation

1.详解点操作符.和箭头操作符->的区别。

http://www.jb51.net/article/36337.htm

2.类型转换
http://hb.qq.com/a/20110722/001452.htm

Summary

了解优先级,了解结合性,了解强制类型转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值