《C++ Primer》 第四章 表达式
重载运算符:为已存在的运算符赋予了另外一层含义。
(-m)/n和m/(-n)等于-(m/2),m%(-n)等于m%n,(-m)%n等于-(m%n)。
溢出:就散结果超出该类型所能表示的范围。
auto pbeg = v.begin();
//输出元素直到遇到第一个负值为止
while(pbeg!=v.end()&&*beg>=0)
cout<<*pbeg++<<endl;//输出当前值并将pbeg向前移动一个元素
后置递增运算符的优先级高于解引用运算符,因此*pbeg++等价于 *(pbeg++)。这条语句输出pbeg开始时指向的那个元素,并将指针向前移动一个位置。
&:运算对象的对应位置都为1,结果为1
|:运算对象的对应位置中只要有一个为1,结果就为1
^:运算对象的对应位置不同为1,相同为0
sizeof(ia)/sizeof(*ia) 返回ia的元素数量
命名的强制类型转换:
cast-name(expression)
cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast
static_cast: 任何具有明确定义的类型转换,只要不包括底层const,都可以用static_cast。例如,通过将一个运算对象强制转换为double类型就能使表达式执行浮点数除法。
//执行强制类型转换以便指向浮点数除法
double slope = static_cast<double>(j) / i;
const_cast:只能改变运算对象的底层const
const char *pc;
char *p = const_cast<char*>(pc); //正确,但是通过p写值是未定义的行为
const char *cp;
//错误:static_cast不能转换掉const性质
char *q=static_cast<char*>(cp);
static_cast<string> (cp); //正确,字符串字面值转换成string类型
const_cast<string> (cp); //错误,const_cast只改变常量属性
reinterpret_cast:
通常为运算对象的位模式提供低层次上的重新解释。
int *ip;
char *pc = reinterpret_cast<char*>(ip);
//pc所指的真实对象是一个int而非字符