解引用运算符生成左值,所以decltype(*p)的结果是 int &。
取地址运算符生成右值,所以decltype(&p)的结果是 int **。
cin >> v1 >> v2; //先读入v1,再读入v2
如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。
cout << v1 << ", " << ++v1 <<endl; //未定义的
cout << 42 + 10; //+的优先级较高,先进行+输出52
*v1++等价于(v1++)。先将v1加1,返回到初始值,解引用的对象是初始值。*
类型转换
int ival = 3.541 + 3; //编译器可能会警告该运算损失了精度
3.14159L + ‘a'; //'a'提升成int,然后该int值转换成long double
强制转换
static_cast :任何具有明确定义的类型转换,只要不包括底层const,都可以使用static_cast.
const_cast : 只能改变运算对象的底层const。
reinterpret_cast : 通常为运算对象的位模式提供较低层次上的重新解释。
int *p;
char *pc = reinterpret_cast<char *> (p);
string str(pc); //引发错误
此时pc所指的真实对象式一个int而非字符,如果把pc当成普通的字符指针使用就会引发错误。