C++ primer 笔记----表达式

1、重载运算符,当运算符作用于类类型的运算对象时,用户可以自行定义其含义;使用重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符定义的,但是运算对象的个数、运算符的优先级和结合律都是无法改变的。

2、一个名字所代表的单元(地址)称为该名的左值,一个名字的值称为该名的右值;
因此当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置);

3、用到左值的情况:
1)赋值运算符需要一个左值作为其左侧运算对象,得到的结果也是一个左值;
2)取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,这指针是一个右值;
3)内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下表运算符的求值结果都是左值;
4)内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结果也是左值;

3、复合表达式是指含有两个或多个运算符的表达式。

4、逻辑与&&,逻辑或||,条件运算符(?:)和逗号运算符(,)这4种运算符明确规定了运算对象的求值顺序是先左后右,只有在仅靠左边的值无法确定该表达式的结果时才会计算右边的值,这种求值策略为“短路求值”

5、如果操作符的两个操作数都与同一个对象相关,而且其中一个操作数改变了该对象的值,则程序将会因此而产生严重的错误——而且这类错误很难发现。

6、移位操作符(<<,>>)具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高

7、将 sizeof 应用在表达式 expr 上,将获得该表达式的结果的类型长度;对数组做 sizeof 操作等效于将对其元素类型做 sizeof 操作的结果乘上数组元素的个数。

8、定义变量时,必须指定其数据类型和名字,而动态创建对象时,只需指定其数据类型,而不必为该对象命名。new表达式返回指向新创建对象的指针,通过该指针来访问此对象。

9、如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。

10、如果两个类型之间可以转换,则称这两个类型相关。

11、整数相除结果还是整数,参与取余运算的运算对象必须是整数类型;

12、(-m)/n和m/(-n)都等于 -(m/n), m%(-n)等于 m%n, (-m)%n等于 -(m%n)。

13、当计算的结果超出了该类型所能表示的最大范围时就会产生溢出。

14、赋值运算符满足右结合律。

15、自增、自减运算符只能用于变量,不能用于常量或表达式。

16、逻辑运算符、关系运算符的返回值都是布尔类型,其运算对象和求值结果都是右值。

17、后置递增运算符的优先级高于解引用运算符,后置递增运算符返回的是初始的未加1的值,先用后加。

18、自增、自减运算符和负号运算符的结合律都是自右向左。

19、表达式ptr->num等价于(*ptr).num。

20、位运算符有六个:与&、或|、异或^、取反~、左移<<和右移>>
位运算是指按二进制进行的运算。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

21、& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0;左移1位相当于该数乘以2

右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

22、不用临时变量交换两个值的方法:位异或^,a=a^b,b=b^a,a=a^b;

23、负数的二进制数用补码表示,即按位取反再加1;

24、异或运算符满足交换律且两个相同的数异或后结果为0,即:
A^B^C^D^E^F^B=A^C^D^E^F;
这一性质常用于寻找数成对出现时缺失的某一个数。

25、不用算数运算符实现两个数的加法:
1)先不考虑进位,按位计算各位累加(用异或实现),得值a;
2)然后计算进位,并将进位的值左移,得值b,若b为0,则a就是加法运算的结果,若b不为0,则a+b即得结果(递归调用该函数)。

26、sizeof运算符满足右结合律。

27、赋值运算符的级别高于逗号运算符。

28、在下面这些情况下,编译器会自动地转换运算对象的类型:
1)在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型;
2)在条件中,非布尔值转换成布尔类型;
3)初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型;
4)如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型;
5)函数调用时也会发生类型转换;

29、命名的强制类型转换
cast-name(expression);
type是转换的目标类型,expression是要转换的值,cast_name是static_cast,dynamic-cast,const_cast,reinterpret_cast的一种。
1)static_cast: 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;
把较大的算术类型赋值给较小的类型
2)const_cast:只能改变运算对象的底层const,只有const_cast能改变表达式的常量属性,且只改变常量属性。用于类型转换掉表达式的const或volatile属性。
3)reinterpret_cast:为运算对象的位模式提供较低层次上的重新解释;转换一个指针为其它类型的指针,一个指针到另一个指针的值的二进制拷贝,不做类型检查。
4)dynamic_cast:它被用于安全地沿着类的继承关系向下进行类型转换,多态情况下常用,进行转换后的类型安全检查。

30、运算符优先级规则:
1)括号,下标,->和.(成员)最高;
2)单目的比双目的高;算术双目的比其他双目的高;
3)移位运算高于关系运算;关系运算高于按位运算(与,或,异或);按位运算高于逻辑运算;
4)三目的只有一个条件运算,低于逻辑运算;
5)赋值运算仅比“,”高,且所有的赋值运算符优先级相同,结合访问位从右向左。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值