1. 左值和右值
当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)
2.算术运算符
c++新标准中,(-m)/n和m/(-n)都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)
cout<<21/6<<endl; //结果是3 cout<<21/-6<<endl; //结果是-3 cout<<-21/-6<<endl; //结果是3 cout<<21%6<<endl; //结果是3 cout<<21%-6<<endl; //结果是3 cout<<-21%-6<<endl; //结果是-3
3. 递增递减运算符:前置版本和后置版本
int i=0,j; j=++i; //j=1,i=1:前置版本得到递增之后的值 j=i++; //j=1,i=2:后置版本得到递增之前的值
前置版本把值加1后直接返回改变了的运算对象,后置版本需要将原始值存储下来,因此如果不需要修改前的值,后置版本的操作是一种浪费,最好使用前置版本的递增递减运算符
4. sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数,满足右结合律
在sizeof的运算对象中解引用一个无效指针是一种安全的行为,因为指针实际上没有真正被使用
int *p sizeof *p; //正确,
对数组执行sizeof运算得到整个数组所占空间的大小,sizeof运算不会把数组转换成指针来处理。
int ia[]={1,2,3,4}; cout<<sizeof(ia)<<endl; //如果一个int占4个字节,则输出16
对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占了多少空间
string str("abcd"); cout<<sizeof(str)<<endl; //在我的机器上输出了28