菜鸟逆袭记之操作符详解

菜鸟逆袭记之操作符详解

  • 1.算术操作符
  • 2.移位操作符
    • (1)左移操作符
    • (2)右移操作符
  • 3.位操作符
  • 4.赋值操作符
  • 5.单目操作符
    • (1)取地址(&)
    • (2)sizeof与数组
    • (3)前置和后置
    • (3)按位取反(~)
  • 6.关系操作符
  • 7.逻辑操作符
  • 8.条件操作符
  • 9.逗号操作符
  • 10.下标引用、函数调用和结构成员
  • 11.表达式求值
    • (1)隐式类型转换
    • (2)算术转换
    • (3)操作符的属性

前言:
这一站与前面的 时空间有一定的联系,想了解更多内容请移步去看看

1.算术操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

2.移位操作符

(1)左移操作符

补充:

1.数据在内存中是以补码的形式存储的,而表达输出的结果是以原码的形式进行表达的。即操作符都是对补码进行操作的

2.正整数的原码,反码和补码是一样的

3.负整数的原码,反码,补码之间的关系是:
(1)反码=(除符号位外)按位取反
(2) 补码=反码+1
菜鸟逆袭记之操作符详解_第1张图片

菜鸟逆袭记之操作符详解_第2张图片
菜鸟逆袭记之操作符详解_第3张图片
菜鸟逆袭记之操作符详解_第4张图片
菜鸟逆袭记之操作符详解_第5张图片

(2)右移操作符

菜鸟逆袭记之操作符详解_第6张图片
菜鸟逆袭记之操作符详解_第7张图片
菜鸟逆袭记之操作符详解_第8张图片

注意:

对于移位操作符,

  1. 不要进行负数移位,这个标准是未定义的
  2. 只能进行整数的操作,不能进行小数的操作

3.位操作符

菜鸟逆袭记之操作符详解_第9张图片

  • &(二进制补码)位与—有0就为0,两个1才为1 (相当于逻辑操作符的&&)
  • |(二进制补码)位或—有1就为1,两个0才为0 (相当于逻辑操作符的||)
  • ^(二进制补码)位异或—相同为0,相异为1
    菜鸟逆袭记之操作符详解_第10张图片
    菜鸟逆袭记之操作符详解_第11张图片

既然已经知道了原理,让我们做几道简单的题来练练手:
菜鸟逆袭记之操作符详解_第12张图片
想必大家都有自己的答案了,让我们来看看正确答案与解题思路
菜鸟逆袭记之操作符详解_第13张图片
下面,咱们上点难度:
实现不用额外的变量来实现两个数的交换

菜鸟逆袭记之操作符详解_第14张图片
菜鸟逆袭记之操作符详解_第15张图片

4.赋值操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

5.单目操作符

菜鸟逆袭记之操作符详解_第16张图片

(1)取地址(&)

就前面的知识,在此补充:

  • 有地址都可以进行取地址
  • 在C语言中,变量,常量字符串,数组,结构体等在内存中都是有地址的,但字面常量(如 2)在内存中是没有地址的
    菜鸟逆袭记之操作符详解_第17张图片

(2)sizeof与数组

之前已经讲过不少这方面的内容,今天就着重讲一下sizeof 与数组

先看一下一下的代码分别输出什么:
菜鸟逆袭记之操作符详解_第18张图片
运行结果:
菜鸟逆袭记之操作符详解_第19张图片

解释一下:菜鸟逆袭记之操作符详解_第20张图片
菜鸟逆袭记之操作符详解_第21张图片

菜鸟逆袭记之操作符详解_第22张图片菜鸟逆袭记之操作符详解_第23张图片

(3)前置和后置

在这里,我们来讨论一下:先使用 后++,和先++后使用 的先后之分到底体现在哪里?

先后之分就体现在是否完成一个完整的语句
菜鸟逆袭记之操作符详解_第24张图片
菜鸟逆袭记之操作符详解_第25张图片

(3)按位取反(~)

~—按(二进制补码)位取反----符号位也取反

菜鸟逆袭记之操作符详解_第26张图片
菜鸟逆袭记之操作符详解_第27张图片

6.关系操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

7.逻辑操作符

在此,我们着重讲解一下逻辑操作分符的控制求值顺序
菜鸟逆袭记之操作符详解_第28张图片

  • &&----左边为假,整体就为假–>右边无需计算
  • ||----左边为真,整体就为真–>右边无需计算
    有的课本称这种现象为短路

接下来,我们来一个例题练练手:
菜鸟逆袭记之操作符详解_第29张图片
运行结果:
菜鸟逆袭记之操作符详解_第30张图片
解释一下原因(要认真看哦)
菜鸟逆袭记之操作符详解_第31张图片
那这个咱就明白了,再来一个巩固巩固吧:
菜鸟逆袭记之操作符详解_第32张图片
运行结果:
菜鸟逆袭记之操作符详解_第33张图片
怎么样,这个做对了吧。这个我也讲一下原因
解释一下原因(要认真看哦)

菜鸟逆袭记之操作符详解_第34张图片
注意:

  1. 区分逻辑与(&&)和按位与(&)
  2. 区分逻辑或(||)和按位或(|)

8.条件操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

9.逗号操作符

  1. 逗号表达式,就是用逗号隔开的多个表达式
  2. 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

菜鸟逆袭记之操作符详解_第35张图片
菜鸟逆袭记之操作符详解_第36张图片
下面,来看一下这个逗号操作符在现实生活中的妙用:
菜鸟逆袭记之操作符详解_第37张图片

10.下标引用、函数调用和结构成员

这里前面已经非常详细地讲解过了。如有不懂,请移步

11.表达式求值

  1. 表达式求值的顺序一部分是由操作符的优先级和结合性决定
  2. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型

(1)隐式类型转换

  1. C的整型算术运算总是至少以缺省整型类型的精度来进行的
  2. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算

整形提升的规则:
菜鸟逆袭记之操作符详解_第38张图片
我们来一点例题来巩固一下:
例子1:
菜鸟逆袭记之操作符详解_第39张图片

  • a,b要进行整形提升,但是c不需要整形提升
  • a,b整形提升之后,变成了负数,所以表达式 a,b的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真

例子2:
菜鸟逆袭记之操作符详解_第40张图片

  • 整型提升这种场景大部分就是两个不同类型之间进行加减乘除 或者比较之类的, 场景不是特别多, 目前先了解这么多, 后边遇到问题可以在具体分析
  • 整形提升的前提是变量的类型是小于整形(int)的类型,在进行表达式运算(即运用操作符时),不足整形的变量要进行整形提升

(2)算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
菜鸟逆袭记之操作符详解_第41张图片

  • 但是算术转换要合理,要不然会有一些潜在的问题

(3)操作符的属性

菜鸟逆袭记之操作符详解_第42张图片

下面我来举例一个问题表达式,以此来证明优先级和结合性都已确定,但先后顺序还是不确定的
菜鸟逆袭记之操作符详解_第43张图片
菜鸟逆袭记之操作符详解_第44张图片
让我来解释一下吧:
菜鸟逆袭记之操作符详解_第45张图片

总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。-------即我们写代码时不要吝啬括号()

你可能感兴趣的:(算法,c++,数据结构)