C++ primer第四章学习笔记(表达式,运算符优先级,强制类型转换)

第四章也是比较基础的,在c语言里面也用到很多,除了这个优先级问题,我反正每次都老实打括号。。。。
这一章就按知识点总结好了,有些会的就不想写了

左值和右值

在编译的时候可能会出现这种错误,下面这种是左值错误,还有一种是右值错误
error: lvalue required as left operand of assignment
当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

求值顺序

很多人会误以为是结合律或者是优先级(其中也包括我),但是其实运算对象的求值顺序与优先级和结合律无关,对于没有规定求值顺序的运算符,如果表达式指向并修改同一对象,则可能会引发错误并产生未定义的行为,如

int i=0;
cout << i <<" "<< ++i <<endl;	//错误:未定义行为

因为编译器可能先求i的值再求i++,结果输出0,1;也可能先求i++的值再求i的值,结果输出1,1。因此表达式的行为不可预知。

有四种运算符规定了运算对象的求值顺序&& || ? : ,

递增运算符和递减运算符

对于前置递增(递减)和后置递增(递减)有很多人会搞混

int i=0,j;
j=++i;	//j=1,i=1:前置得到的是递增之后的值,先计算i++,然后j=i
j=i++;	//j=1,j=2:后置得到的是递增之前的值,先计算j=i,然后i++

位运算符

这个还是再拿出来说一下好了,因为在做课后习题的时候,4.25题发现了两个版本的答案

4.25 如果一台机器上int占32位,char占8位,用的是Latin-1字符集,其中字符‘q’的二进制形式是0111 0001,那么表达式~‘q’<<6的值是什么?

运算符~的优先级高于运算符<<的优先级,由于是求值所有最后结果应该是int型,所以先执行 ~‘q’
‘q’ :0000 0000 0000 0000 0000 0000 0111 0001
~‘q’:1111 1111 1111 1111 1111 1111 1000 1110
~‘q’<<6: 1111 1111 1111 1111 1110 0011 1000 0000
由于是有符号数,所以最高位是符号位,答案是-7296

类型转换

这里介绍显式转换
命名的强制类型转换有如下形式
cast-name<type>(expression)
type是转换的目标类型,expression是要转换的值,cast-name是static_castdynamic_castconst_castreinterpret_cast

danamic_cast支持运行时类型识别,将在后面的章节介绍

static_cast: 任何具有明确定义的类型转换,不包括底层const指针(指针所指对象是常量)
double k=static_cast<double(j)/i;>

const_cast: 只能改变运算对象的底层指针
const char * pc;
char *p = const_cast<char*>(pc);

reinterpret_cast: 通常为运算对象的位模式提供较低层次上的重新解释
int *ip;
char *pc = reinterpret_cast<char *> (ip);

最后附上一张运算符优先级表
运算符优先级表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章