查漏补缺——表达式

1、左值和右值

当一个对象被用作右值的时候,用得是对象的值(内容);当对象被用作左值的时候,用得是对象的身份(在内存中的位置)。

一个重要的原则是,在需要右值的地方可以用左值来代替,这时候实际使用的是左值的内容(值)。


2、取余运算

参与取余运算的运算对象必须是整数类型。

在新标准中,除了-m导致溢出的特殊情况,其他时候(-m)/n和m/(-n)都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)


3、短路求值

逻辑与运算符&&与逻辑或运算符||都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式结果时才会计算右侧运算对象的值。这种策略就是短路求值


4、运算符优先级

(1)赋值运算符的优先级低于关系运算符的优先级。

(2)解引用运算符的优先级低于点运算符:(*p).size()这样得到正确的结果,若*p.size()则是对一个指针进行点运算,指针没有名为size的成员。

(3)条件运算符(?:)的优先级非常低,当在一条昌表达式中嵌套了条件运算子表达式时,通常需要在它两端加上括号。



5、位运算符

位运算符有:<<  >>  & |  ^  ~

运算对象可以是带符号或无符号的,如果运算对象是带符号的且它的值为负,那么位运算符如何处理运算对象的符号位依赖于机器,而且,此时的左移操作可能会改变符号位的值,所以强烈建议仅将位运算符用于处理无符号类型


6、sizeof运算符

sizeof运算符的结果部分地依赖其作用的类型:

  • 对引用类型执行sizeof运算得到被引用对象所占空间的大小
  • 对指针执行sizeof运算得到指针本身所占空间的大小
  • 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需要有效(sizeof运算符并不需要我们提供一个具体的对象)
  • 对数组执行sizeof运算得到整个数组所占空间的大小,sizeof运算符不会把数组转换成指针来处理
  • 对string或vector对象执行sizeof运算,只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间

7、显示转换
  • static_cast:只要不包含底层const,都可以使用它。当需要把一个较大的算术类型赋值给一个较小的类型时,static_cast非常有用,此时该强制类型转换告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。static_cast对于编译器无法自动执行的类型转换也是非常有用。
  • const_cast:它只能改变底层的const。将常量对象去掉const性质,转换为非常量的对象。只要const_cast能改变表达式的常量属性。其他的强制类型转换改变表达式的常量属性都会引起编译器错误。不能用const_cast改变表达式的类型
  • reinterpret_cast:这个转换本质上是依赖于机器,想要安全的使用它必须对涉及的类型和编译器实现转换的过程都要非常了解,使用它是非常危险的。它通常为运算对象的位模式提供较低层次上的重新解释
  • dynamic_cast:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理,如果基类指针或者引用确实指向一个派生类对象 ,这个运算符会传回适当转型过的指针。如果 downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。dynamic_cast <type-id> (expression),该运算符把expression转换成type-id类型的对象。Type-id 必须是类的指针、类的引用或者void*;如果 type-id 是类指针类型,那么expression也必须是一个指针,如果 type-id 是一个引用,那么 expression 也必须是一个引用。
建议:避免强制类型转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值