1.养成使用自增自减前置操作符这个好习惯(性能比较高)。
前置操作符:只需加1后返回加1后的结果即可。
后置操作符:必须保存操作数原来的值,以便返回未加1之前的值作为操作的结果
*sp.foo;是先执行sp.foo,而不是*sp。
Questionable Examples
1.char *cp="Hello World";while(cp&&*cp);
这个while循环的条件cp&&*cp的意思就是cp不是空指针并且cp指向的串不是空串。
for(vector<string>::iterator it=v.begin();it!=v.end();)
{
cout<<it++->empty()<<endl;
}
代码会输出vector中每一个元素是否是空串。
iter++->empty()的执行顺序时iter先++然后返回iter的原值并且测试原值是否为空。
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优先级乘除求余加减移, // 这句里面的运算符全归为算术运算符,移表示移位
关系等于不等于, // 关系运算符(< <= > >=)
按位与来异或或, // 位运算符优先级顺序: & -> ^ -> |
逻辑与或条件弱, // 逻辑运算符优先级顺序: && -> ||,后面跟着优先级比较低(弱)的条件运算符
赋值逗号一点破。 // 赋值,逗号最低
int *p=new int;//pi指向一个未初始化的int
int *p=new int();//pi指向int型变量0(初始化为0)
6.如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。
1.详解点操作符.和箭头操作符->的区别。
http://www.jb51.net/article/36337.htm
http://hb.qq.com/a/20110722/001452.htm
Summary
了解优先级,了解结合性,了解强制类型转换。