C++ Primer读书笔记4.2~4.10:各种运算符

9 篇文章 0 订阅
2 篇文章 0 订阅

4.2 算数运算符

算数运算符中,一元运算符的优先级高于而二元运算符。算数运算符的运算对象和结果都是右值,其两端的运算对象最终会被转换为同一类型。
通常布尔类型虽然算是整形的一种,但是其不应该参加算数运算,比如布尔变量b的值为真,在运算时它将被提升为整数1,而-b为-1,-1转换为bool类型仍然为true,而不是false。

在除法中,c++早期版本允许结果为负值的商向上或向下取证,但是在c++11中规定商一律向0取整。

关于取余符号

参与取余运算的对象必须是整数类型,其两端对象如果不符合要求并不会进行类型转换,而是会直接报错。
如果m%n不等于0,则它的符号与m相同。c++早期版本允许m%nd的符号匹配n的符号,而且商向负无穷一侧取整,这一方式在新标准中被移除。

4.3 逻辑与关系运算符

运算对象以及结果都是右值。
|| 、&&具有短路求值特性。
在进行比较运算时除非比较的对象时布尔类型,否则不要使用布尔字面量true和false座位比较对象。

int i = 3;
bool b = false;
int *p = nullptr;
if(i);          //不需要与true或false比较
if(b == true);
if(p);          //不需要与true或false比较
if(p != nullptr);   //可以与空指针进行比较

4.4赋值运算符

赋值运算符的左侧运算对象必须是一个可修改的左值
赋值运算符满足右结合律。
赋值运算符的优先级较低,比关系运算符的优先级还低。
注意各种复合1赋值运算符。
要特别区分赋值运算符与等于运算符

if(i= 1)    //永远为true,通常来说没有意义
if(i == 1)

4.5递增与递减

通常来说应该使用递增递减符号的前置版本。
后置递增运算符的优先级高于解引用运算符,所以pbeg++等价于 (pbeg++)。我们应该熟悉 *itr++这样的写法,因为这样可以使代码更加简洁。
要特别注意运算对象的求值顺序

*beg = toupper(*beg ++);    //存在歧义,因为左右对象的求值顺序未确定

4.6成员访问运算符

点运算符以及箭头运算符都可用于访问对象的成员。
因为解引用运算符的优先级低于点运算符,所以如下

string s;
string *ps =  &s;
*s.size();          //错误,相当于*(s.size())
(*s).size();        //正确
s->size();          //正确,直接使用箭头运算符访问成员

为了省去上面加括号那样繁琐的算法,所以有了箭头访问符。
箭头访问符·的返回结果是一个左值。

4.7 条件运算符

cond ? expr1 : expr2;
cond为true则计算表达式1,否则计算表达式2。需要特别注意的是,不会同时计算两个表达式。
条件运算符可以嵌套使用,但是通常不应该嵌套多层,那样会降低代码的可读性。
条件运算符的优先级特别低。

4.8位运算符

位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。
位运算对象同样能用于bitset类型。
一般来说,如果运算对象是“小整数”,则它的值会被自动提升为较大的整数类型。如果运算对象是带符号的且其值是负,则位运算符如何处理运算对象的符号位依赖于机器。而且此时左移操作可能会改变符号位,因此这是一种未定义行为,所以强烈建议仅将位运算符用于处理无符号整数

“<<” 左移,在右侧插入0
“>>” 右移, 如果运算对象是无符号整数,则在左侧插入0,如果是带符号整数,则插入0或者符号位的拷贝,这 视环境而定。
~ 取反
& 相与
| 相或
^ 异或(理解为判断两个对象的相应位数是否不同,不同则结果为1,否则为0)

移位运算符的优先级低于算数运算符,但是高于关系运算符、赋值运算符、条件运算符。

4.9sizeof运算符

返回一条表达式或一个类型名所占的字节数,其返回值是size_t类型。

sizeof (type);
size  (expr);

sizeof满足右结合律,而且其与*运算符的优先级相同,所以有如下形式

sizeof *p  //等价以sizeof(*p)

另外由于sizeof**并不会实际计算表达式的值**,所以在上述表达式中即使p为一个空指针,其仍是合法的。
c++新标准允许我们使用域运算符来获取类成员的大小,而不需要通过实际的对象。

sizeof Sales_data::revenue;         //不需要有一个实际的Sale_data对象。

对数组执行sizeof运算得到的是整个数组所占的空间大小,sizeof不会吧数组转换成元素指针来处理。
对string vector等容器sizeof只返回该类型固定部分的大小,而不会计算对象中元素所占用的空间。

size_t sz = sizeof(ia) / sizeof(*ia);       //ia是一个数组名。此语句用于求数组的size,此用法很常见

4.10 逗号运算符

逗号运算符按从左到右的顺序求值,并且去最右侧运算对象的结果作为求值结果。如果最右侧运算对象是左值,那么运算结果也是一个左值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值