C语言之操作符详解

简介: 本章重点1. 各种操作符的介绍2. 表达式求值

本章重点

1. 各种操作符的介绍

2. 表达式求值


给大家提到一些操作符,下面我们来给大家详细介绍

a66cd51382a049549191d03574500107.png

首先看算术操作符,其他几个都没什么可讲的我们来重点看一下/(除法)


整数除法(除号的两端都是整数)


浮点数除法(除号的两端只要有一个小数就执行小数除法),我们依然用我们的VS2019给大家进行演示


fdeff40e4fb541ad889dc364ad84bbb6.png


整数除法(7  /  2)无法打印3.5,改成double类型也是不能的


那么如果我们想要得到小数呢,我们看代码


我们根据浮点数除法概念,除号两边只需一个小数就打印小数


这里强调一点:在除法中,除数不可以为0


b58fc7dbf45246de91cfb21a08a01fa7.png


接着我们来看%算术运算符


%---得到的是整除后的余数


4ab1bb5a9f514314b87cb1af4399d98b.png


画重点


这里需注意的是%取模操作符的两个操作数必须都是整数,如果大家不相信,我们来看代码验证一下


b3ca8c38d712479da502d408c0f5a567.png


接下来我们看移位操作符


0e782f2da7d44122aed804359c6cf000.png


注意:这里移动的是二进制


在我们最开始接触计算机的时候,计算机能够处理的是二进制的信息


比如15--10进制数,需将其转化为计算机能够识别的二进制序列


下面我们来看代码

72f8c2f3d52547ed88180c4818bfa7b1.png


整数的二进制表示形式有三种:原码,反码,补码


1.正整数的原码,反码,补码都是相同的


2.负整数的原码,反码,补码是需要通过计算得到的


首先不管是正整数还是负整数,都可以写出二进制原码


1.根据正负直接写出的二进制序列就是原码


例如


e3983505e7534ca7a1a5fd702269e88d.png


15的二进制序列是1111,有的同学不理解,这里给大家解释一下,二进制每一位都是有自己的权重的,10进制每一位也都是有自己的权重的,例如十进制数123,下面给大家画图讲解


19a1ddc2f3bd46eca665a076a7f9cbbe.png


十进制大家如果清楚了那我们的二进制的,还是用15的例子,大家看图


be2bf5f4bd7b477aad6b7be120f2262c.png


加起来正好等于15


在举个例子,大家尝试着自己去动手操作一下,比如24的二进制序列是多少,大家先自己操作一下,再看我给大家的答案


40ac7fe46d04462da1efd4e4795c65a5.png


1个整型是4个字节=32个比特位,用15这个例子,那么15的二进制序列就为00000000000000000000000000001111,注意最前面的那个0是符号位,符号位为0表示整数,符号位位1表示负数


-15的二进制序列就是把符号位改为1即可


a159708f71b1480d97facef8a4ac5c7b.png


我们再来看代码,我在代码后面给大家详细注释了每一步的意思,希望大家能看懂


正整数的原码,反码,补码都是相同的


负整数的原码,反码,补码是需要计算的


这里给大家详细讲解一下负整数的原码,反码,补码的计算


负整数的反码(原码符号位不变,其他位按位取反得到反码)


负整数的补码(负整数的反码+1得到补码)


希望大家能理解


另外大家特别注意,整数在内存中的存储存储的是补码计算的时候也是使用补码计算的,这个知识在我们数据在内存中的存储这两个博客中会用到,大家可在此多停留一会儿思考一下


bfbc1d3777cb41f2b23e22c8f2e8faac.png


现在给大家讲解一下左移和右移运算符


右移:


算术右移(右边丢弃,左边补原来的符号位)


逻辑右移(右边丢弃,左边直接补0)


C语言本身没有明确规定到底是算术右移还是逻辑右移,一般编译器上采用的是算术右移


我们现在来看例子


7099d969f145437ea3c42e5ca6a9d36e.png


画个图给大家理解一下


ad0fbefad02f4bea820cf26254055bcc.png


按照我上面给大家的讲解理解起来就比较容易


这里就稍微复杂一点了,前面我们说整数在内存中的存储是补码,计算时也是使用补码进行计算的


下图代码就是一个很好的例子,利用a的补码进行计算求出b的原码,这是我反着来,补码-1得到反码,然后符号位不变,其他位按位取反得到b的原码,希望大家能够理解


6da0c964233649e8a31194d49b09c6f3.png


那么左移呢???看下图


3a383001a66646688a0aacfb7990e337.png


d8841e6edc1443f59ed12efe2859c3e9.png


注意,一再强调,计算时是利用补码进行计算的,大家务必注意,并且移位操作符中的操作数只适用于正整数,比如a>>-1就不可取(标准未定义行为),希望大家能够理解


下一个知识点

dedc6ffca29f4395ad955980594249d0.png

fe43d8be2b4940fdb85301eac89cb07a.png


给大家上代码来理解


&---对应二进制位有0则为0,两个同时为1,才是1


这里再次强调,计算时是用的补码,整数的原码,反码,补码相同,所以c(原码等于补码)的值为3


|---按(2进制)位或 - 对应的二进制位有1则为1,两个同时为0才是0


e5210477243846adb228352fd2089a4a.png


^----按二进制位异或 -对应的二进制位相同为0,相异为1


c0ec73935e184661a5744cf2418c4745.png


这里再教大家一个知识,我们脑袋中常规的C语言交换两个数的方法是定义一个中间变量进行交换,今天教给大家一个新方法,大家理解即可,我们看代码


这里需要给大家讲解一下异或操作符的规则


根据前面异或的规则大家再看我给大家的代码讲解和注释 ,上半部分代码是计算


下半部分代码是举例解释


220546d0f47a4cc4b75836bac6bc610e.png


给大家再画个图以便大家理解


300a19098bf746caba502a7bc1656c9e.png


这种方法很难想,同学们尝试着理解一下,不用一定掌握


来看下一个知识点

c9e8a4597ec24b3cb457829bd2a0bf5a.png

这个东西我们平时很常见,这里给大家一张图片自己理解一下,因为比较简单,我就不做详细讲解了

e281a9fec3dd4628aef72b82fd0e789a.png


来看下一个知识点

6d5baca0cb6a4900a550b0c5661ccde0.png

单目操作符只有一个操作数


双目操作符有两个操作数


来看代码


b064f893fb1f42ccb87687e30a35ccfe.png


+ - 号没什么好讲解的,大家直接看代码


0de8b8af938d42efa8ca72564c30b69f.png


我们来看&和*操作符,看代码,注意指针部分的初阶和进阶知识我们在后期会给大家详细讲解,这里大家简单看我代码后面的注释尝试着理解一下

097e903f2fb44b56a9c7ed8564db42e4.png

这里给大家介绍一下sizeof


sizeof不是函数,而是操作符


sizeof计算的是类型创建变量的大小,单位是字节


我们来看代码


a336391ce83247a69a83625d3fc0d00e.png


那我们要计算数组的大小呢,我们来看代码


去掉arr就是数组的类型,并且不能是int [5],结果是20,因为值计算了5个元素的大小,大家感兴趣的可以去研究一下

e6b8e54bb5624f27b8042d98049f5945.png

~ 操作符,我已经把代码给大家了,注释也给大家了 ,大家可以计算一下

ea6535daf48043ea812eedd7814a6e78.png

29521449a89949f189a23a2e93cd12b1.png


结果是-1,根据~的概念进行计算,先算出补码,然后根据补码按位取反,得到新的补码通过计算得到原码,希望大家能够理解


现在给大家一个例子,给大家一个应用,看代码


大家下来再VS2013,VS2019,VS2022上面自己实操一下,巩固一下知识

c8e095dff1a042df803606e4422a880a.png

scanf读取失败就返回EOF,所以scanf还可以写成下面的模式,当你想要while循环停下来的时候按住control + z 即可

fc42d98f68264c74b100e0c3b7f13726.png

还有一种形式,看代码,代码注释已经给大家了,我就不再做详细讲解了

0b96f26ea5c44167b071ab0ddd72904b.png

--前置,后置--


++前置,后置++


我们来详细讲解


先将a=1的值赋给b,a=1的值再自增得到2

f08f66f720154e19ba6dfee7474523c9.png

看下一个代码

89666e08706b45a8b811ac3bbdce2037.png

道理和上一个代码相同


这一个代码意思是先将a = 1加1,再赋值给b,b得到2,a = 2


a7426f58727e4ec6a267133a8b878284.png


看下一个代码


90cc9bcee90242c39cc21801185fcab2.png


道理和上一个代码相同,希望大家能够理解


我们再看一个实例,大家自己思考一下,试运行得出结果


60dcaec7dcc74c08acbfdabae267e56c.png


结果为


10


11


下一个知识点是强制类型转换


看代码就能够理解,看下面代码


99d3345e759d4612b5a559f224683948.png


下面给大家讲解关系操作符


4bfbecff06e04475a8c5b60ab1f1c4ae.png


这些操作符没什么可讲的,但是这些操作符只能应用到适合的类型上,比如比较操作符就不能应用于字符串的比较,希望大家能够理解


下一个知识点是逻辑操作符

d1c38883157d43b0915b74a2196a4cf4.png

逻辑与(并且)


逻辑或(或者)


比如:老师:张三并且李四,来我办公室,张三和李四都来了,才能满是老师的要求,张三和李四只来一个或者都不来就不行


比如:老师:张三或者李四,来我的办公室,张三和李四都来可以,张三和李四来一个可以,张三和李四都不来就不行,希望大家能够理解


看看代码

25688baf2cab4f7588763543fa626b60.png

按照我给大家举的生活实例就能够理解


下一个知识点


2a74f4319fbb48019c4c3bccfaaf9712.png


我们看代码


ac50ed2a797b480281f4942929c833f8.png


a  >  5如果为真,就去 3 这个值,若为假就取 - 3 这个值


下一个知识点


929c1fcb45e34d689d77d021dc016299.png


逗号表达式特点:从左向右计算,整个表达式的结果是最后一个表达式的结果


6a72074f0e424d2d81793b4b1181998b.png


下一个知识点

9f379480f3184371bb707e65cb80e084.png

f268a73968104ac6b293acc665e63d6f.png

0985450a3994474683fcf5b6f7642772.png


下标引用操作符在数组的博客中已经讲过了,这里就不做过多讲解


注意printf函数后面的......是可变参数列表(参数的个数是可以变化的)的意思,不是汉语中的省略号的意思,大家有兴趣下来可以去探索一下

0b21f282f0974fc6bf9128052dfaff30.png

结构体类型已经在上图给大家讲清楚了,大家先尝试理解一下


我们看代码


第一种写法


3d1c2fc5ee8245058c090643aacba923.png


第二种写法(指针)


0dac161699d74b5f855182c3668ea07d.png


我们看代码


9ee21bf2707e4e5ba752662bcd87615b.png


代码和注释给大家,大家自行看一看,理解起来还是比较简单的,如果在此之前有什么问题,可以在评论区提问或者私聊我,我会尽力给大家解决


931c4997c00e4c448ad8fd7506348705.png


本章终,有任何疑,评论区提问哈,谢谢大家的支持


 


相关文章
|
20天前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
65 8
|
20天前
|
C语言
【C语言】逻辑操作符详解 - 《真假美猴王 ! 》
C语言中有三种主要的逻辑运算符:逻辑与(`&&`)、逻辑或(`||`)和逻辑非(`!`)。这些运算符用于执行布尔逻辑运算。
62 7
|
4月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
88 0
|
4月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
300 0
|
2月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
48 10
|
2月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
185 1
|
2月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
188 0
|
4月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
47 6
|
4月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
63 0
十一:《初学C语言》—  操作符详解(上)
|
5月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
46 1
五:《初学C语言》—  操作符