菜鸟逆袭记之操作符详解

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

1.算术操作符

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

2.移位操作符

7fcc8ad926dd4556af92cbfcadef9d1e.png

(1)左移操作符

补充:


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


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


3.负整数的原码,反码,补码之间的关系是:

(1)反码=(除符号位外)按位取反

(2) 补码=反码+1


7e934006064447e6bd365dfb703a732d.png

0ef041c591624bb699c4e12863b1ad41.png

89ae7a41a0b74e72b2052e6b9833c3f5.png

7cb6ae84af3c435eab59dc1e19cd154d.png

(2)右移操作符

dae2c348626d405aa4cf070e2f43785b.png

9abd4a06e6da427791ca672b1fe0d583.png

注意:

对于移位操作符,


不要进行负数移位,这个标准是未定义的

只能进行整数的操作,不能进行小数的操作


3.位操作符

944e8c3cfba04e71963aacbbedbd1360.png

&—按(二进制补码)位与—有0就为0,两个1才为1 (相当于逻辑操作符的&&)

|—按(二进制补码)位或—有1就为1,两个0才为0 (相当于逻辑操作符的||)

^—按(二进制补码)位异或—相同为0,相异为1

8491f40645e24e76845e71d70932f6e7.png

8df68ae27b964e3da10a947d51cf2cee.png

既然已经知道了原理,让我们做几道简单的题来练练手:

81978cd009b747a996f8dd85d6f99f25.png

想必大家都有自己的答案了,让我们来看看正确答案与解题思路

ed5a958d88bc44b497abf9e2eb0a1820.png

下面,咱们上点难度:

实现不用额外的变量来实现两个数的交换

388ca0f54bdf430eadf997c315f84e99.png


50fa9aad2560467a8a44b7093664ac55.png

4.赋值操作符

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


5.单目操作符

00424bd4c5e942b89cd49fab86a6032b.png


(1)取地址(&)

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


有地址都可以进行取地址

在C语言中,变量,常量字符串,数组,结构体等在内存中都是有地址的,但字面常量(如 2)在内存中是没有地址的

9b14f2fa24064cf6b43bdff6fcf6822d.png

(2)sizeof与数组

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


先看一下一下的代码分别输出什么:

f363646a00c84f6b98da289118275ecc.png

运行结果:

eaaaac7137c04b94a7cf5e0d2513d403.png


解释一下:

220a17cd01f94c3fa7042bc0584e4ea8[0].png

e500b000cfb247c8a7840543387a3dbe.png

ef624f92062d4df79b2c179dcd8f0357.png

15f146db8176493b827eac126282ec81.png

(3)前置和后置

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


先后之分就体现在是否完成一个完整的语句

871fc56404984db49634f405ea7dd7f5.png

93a8adc25aae4a488dd2255b073f3da6.png

(3)按位取反(~)

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


ae54454b11cf482399f868fca7fdd319.png

75194e13b69e421fa778403a3fc61323.png


6.关系操作符

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


7.逻辑操作符

7c5c001df56d4021807617d6faa31884.png

6e72aa2a08a74875862d097c8e099ed0.png

在此,我们着重讲解一下逻辑操作分符的控制求值顺序

6e72aa2a08a74875862d097c8e099ed0[0].png


&&----左边为假,整体就为假–>右边无需计算

||----左边为真,整体就为真–>右边无需计算

有的课本称这种现象为短路

接下来,我们来一个例题练练手:

c2ef80da39e246a0b165ae9b368ed685.png

运行结果:

3902ecfe04f247369d8920c502014488.png

解释一下原因(要认真看哦)

c3752899aa864243a02281d56f48acb7.png

那这个咱就明白了,再来一个巩固巩固吧:

5dd22a099c0641f29f30ed872c2770d9.png

运行结果:

f2882b9bc7c342e78be14f66ad00f790.png

怎么样,这个做对了吧。这个我也讲一下原因

解释一下原因(要认真看哦)

8de4ee60f8c44507bf4be4d9df2782c9.png

注意:

区分逻辑与(&&)和按位与(&)

区分逻辑或(||)和按位或(|)


8.条件操作符

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


9.逗号操作符

逗号表达式,就是用逗号隔开的多个表达式

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

277a6d661cc8492e9cd57354b24f2116.png

3570ff8c1dbe405392534c23a7587d8c.png

下面,来看一下这个逗号操作符在现实生活中的妙用:

1347990e6a1e4438ac47fde09bff9046.png


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

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


11.表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定

同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型

(1)隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度

一般就是int的字节长度,同时也是CPU的通用寄存器的长度

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度

通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算


整形提升的规则:

1b0401cc8e284e8f9ed8c76875da3a65.png

我们来一点例题来巩固一下:

例子1:

27d64c1a191c46bdb15f6cc4a86842ab.png


a,b要进行整形提升,但是c不需要整形提升

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

例子2:

e586a75c31da422c88062fab541d1ed3.png


整型提升这种场景大部分就是两个不同类型之间进行加减乘除 或者比较之类的, 场景不是特别多, 目前先了解这么多, 后边遇到问题可以在具体分析

整形提升的前提是变量的类型是小于整形(int)的类型,在进行表达式运算(即运用操作符时),不足整形的变量要进行整形提升

(2)算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

cf8184a57b014d8fbb5fd6a97494f633.png

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


(3)操作符的属性

a7363abc2fa04afca5f5740fc3236e01.png

下面我来举例一个问题表达式,以此来证明优先级和结合性都已确定,但先后顺序还是不确定的

d99685fdb8b543fc8499e89dd1b5389c.png

5f886fafa42f449ab0100301f1d1effa.png

让我来解释一下吧:

da48c3e7c7fc4661967891d80f62157a.png


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


相关文章
|
5月前
|
C语言
王桂林C语言从放弃到入门课程
课程目标16天,每天6节课,每节40分钟课堂实录,带你征服C语言,让所有学过和没有学过C语言的人,或是正准备学习C语言的人,找到学习C语言的不二法门。适用人群所有学过和没有学过C语言的人,或是正准备学习C语言的人!
64 2
王桂林C语言从放弃到入门课程
|
4月前
|
Java 索引
杨老师课堂_Java教程第四篇之数组运用
杨老师课堂_Java教程第四篇之数组运用
37 0
|
4月前
|
Java
杨老师课堂_Java教程第五篇之函数运用
杨老师课堂_Java教程第五篇之函数运用
26 1
|
4月前
|
Java
杨老师课堂_Java教程第三篇之控制语句
杨老师课堂_Java教程第三篇之控制语句
26 1
|
4月前
|
Java
杨老师课堂_Java教程第六篇之引用数据类型_类的运用
杨老师课堂_Java教程第六篇之引用数据类型_类的运用
30 1
|
4月前
|
Java
杨老师课堂_Java教程第二篇之变量及运算符
杨老师课堂_Java教程第二篇之变量及运算符
16 0
|
程序员 C语言 C++
菜鸟逆袭记
由于C语言是基础,C生万物。作为初学者的我们,C语言是当前掌握的重点。
【菜鸟逆袭记】之初识操作符
【菜鸟逆袭记】之初识操作符
|
程序员 编译器 Serverless
【菜鸟逆袭记】之初识函数
在数学的学习过程中,我们经常与函数这个概念打交道。什么幂函数,指数函数…它们都有共同的基本结构:自变量,因变量,函数表达式。那么C语言中的函数也是这样吗?让我们通过这一站的学习,来了解了解C语言中的函数
菜鸟逆袭记之【初识C语言】
这一站,只是为了让我们大概的了解C语言,有些知识讲的不是特别深刻。不过,不要担心,我们这是一个连续节目。先入门,再精通。一上来讲的太难,就会导致从入门到放弃。