移位操作符具有中等优先级:其优先级比算术操作符低,但是比关系运算符、赋值运算符和条件操作符优先级高。若IP表达式的操作数包含了比IO操作符优先级低的操作符,相关的优先级将影响书写该表达式的方式。这种情况下,使用圆括号强制实现右集结合。
cout<<423+10; //ok.+has higher prcedence cout<<10<42;// error .attempt to compare cout to 42 cout<<(10<42) //yes //第二个cout解释为(cout<<10)<42,cout的结果和42比较(二)复合赋值操作符
sum+=10; sum=sum+10;
这两种语法有一个显著的差别,使用复合赋值操作符时,左操作数只计算了一次;而使用相似的常表达式时,该操作数则计算了两次,第一次作为右操作数,而第二次则用作左操作数,当然这个差别不是本质性的。
(三)自增和自减操作符的一些技巧
关于i++和++i的区别我在这里就不赘述了,这里有一个很重要的建议是:只有在必要时才使用后置操作符。原因是:前置操作符所做的工作最少,只需+1后返回+1后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回+1之前的值作为操作的结果,对于int型对象和指针,编译器可优化掉这项额外的工作。但是对于更多的复杂迭代器的类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作是个好习惯,就不必操心性能差异的问题。
(四)sizeof操作符
sizeof操作符的作用是返回一个对象或者类型名的长度,也可用于求数组等在内存中的存储长度。
#include <iostream> #include <string> #include <fstream> using namespace std; int main() { int sum; cout<<sizeof(sum)<<endl; //4 cout<<sizeof(int)<<endl; //4 int x[10]; int *p=x; cout<<sizeof(x)/sizeof(*x)<<endl; //10 cout<<sizeof(p)/sizeof(*p)<<endl; //1 }
int pi1=new int; //未初始化 int pi2=new int();//0 string *pos1=new string; string *pos2=new string(); int *ip=0; delete ip; //delete NULL is ok动态创建的对象和在函数内部创建的变量的初始化方式相同,对于类类型的对象,用该类的默认构造函数初始化;而内置类型的对象则无初始化。
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++ Primer 学习笔记与思考_9 表达式中过的那些容易忽略的地方
原文地址:http://blog.csdn.net/nk_test/article/details/48035865