C语言函数——操作符讲解(1)

作者:几冬雪来

时间:2023年2月13日

内容:C语言操作符讲解

目录

前言: 

操作符: 

1.操作符的分类: 

2.算术操作符: 

3.移位操作符: 

 4.位操作符:

5.赋值操作符: 

6.单目操作符:

布尔类型: 

结尾: 


前言: 

在上一篇博客中,我们结束了对C语言函数数组内容的初步理解,今天开始我们将讲解新的内容,也就是——操作符。在以前我们对操作符这方面的内容进行过粗略的讲解,今天我们将对其进行更加详细的讲解和延伸。

操作符: 

在我们学习C语言的过程中,我们有许多不同种类的操作符,同种类型的操作符之间也有许多不同的用法,那么在正式学习操作符之前,我们先将操作符的种类进行分类

1.操作符的分类: 

要学习操作符,首先我们要对操作符进行一个大致的分类,这样子做有利于我们更加方便的学习操作符的内容。

2.算术操作符: 

首当其冲的就是我们的算术操作符,在这之前我们已经有对算术操作符进行了详细的讲解,那么今天我们就来简单的回顾一下。

算术操作符也就是我们数学中的加减乘除,只不过和数学的除相比我们的除号的用法有所不同。而且我们在C语言中多出了‘%’这个操作符。 相信大家对加减乘都没有什么太大的争议,那么我们就着重的讲解另外两个操作符。

按照我们数学的算法,10/3的值是3.333···的无止境的结果,但是在我们的C语言中我们计算出来的答案却是整数,这是为什么。

从这张图可以得出,在数学中我们计算10/3的结果是得3余1那么在C语言中,3就是我们10/3的结果,1就是我们的10%3的结果。 

如果要计算出小数的话,除号两边必须要求有一个以上的浮点数。

这样就能得到我们小数的结果了。 

3.移位操作符: 

讲解完了算术操作符,接下来我们就来开始讲解移位操作符。

那么移位操作符是移的什么位呢?我可以准确的告诉你,移位操作符在我们C语言中其实移动的是二进制位,我们举个例子。

那么它是怎么样进行移位的呢?这里就涉及我们整数二进制的表示形式。 

在编译器中整数存在着3种二进制的表达形式我们将它们称为——原码,反码和补码。 

那么我们的原码又是怎么来的?在C语言中,我们按照一个数的正负直接写出它的二进制形式就是我们的原码。又因为正数的原反补码相同,所以10的原码也就是10的反码和补码。

接下来我们来写负数的原码,反码和补码。

对比起正数10的原码,-10的原码则是将10原码最高位的0换为了1。这就是我们-10的原码,接下来的反码和补码也有所不同。 

负数的原码符号位不变,其他位按位取反就得到了我们的反码

因此我们也能写出它的反码。

负数的补码则是在反码的基础上加一。这就可以得到我们的补码。

因此在参与移位的时候我们移动的都是补码的位。所以我们整理出来一张图。

接下来我们来实现左移的操作,我们将整数10向左移动一位。那么移动后我们的值会发生什么变化?移走的那位该怎么处理,如果去掉移走的那一位,剩下了31位又应该怎么补值?

在我们的这张图中可以发现在正数左移的过程中,我们会将移出的一位去除,然后在代码的最后面补0所以左移操作符的规则是左边丢弃,右边补0。

同时也要注意:a<<1后,a的值还是原来的值,并没有发生变化。 

同样的我们的负数也是和左移操作符的规则一样,都是左边丢弃,右边补0。

讲解完左移操作符后,接下来就要讲解我们的右移操作符,但是和左移操作符不同的是右移操作符要更加的麻烦一些,那么是哪里变麻烦了?

因为在右移的时候取决于编译器,有两种移动方法。

那我们简单的来讲解一下两种方法的运算规律:

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

逻辑右移:右边丢弃,左边直接补0。

那我们右移是使用的哪种方法?这里我们部分去试验一下。

由此可见,在进行右移的时候,我们编译器进行的是算术右移。 

在我们写移位操作符的时候我们要注意:

对于移位操作符,我们不能移动负数位,因为这是未被定义的。如:a>>-1

也不能移动过大位。如:a>>50

 4.位操作符:

讲解完了移位操作符,那么接下来我们既要来开始讲位操作符 。位操作符有3种,分别实现3种不同的功能,我们也写代码来实现。

首当其冲的是我们的‘&’操作符,它的名字被称为按位与,意思就是,按(二进制)位与。我们看出上面这个代码,我们将a和b两个值的补码都写出来了,所以按位与当然就是靠补码来计算。那么是怎么样计算的,我们就来说明一下。

&——两个数对应的二进制位是有0则为0;只有当两个值的某位为1的时候才为1。

既然讲解了按位与,那么我们就来简单的说明一下按位或。

按位或与按位与相反。

|—— 两个数对应的二进制位是有1则为1;只有当两个值的某位为0的时候才为0。

现在就剩下一个位操作符了,‘^’也被我们称为按位异或。它的功能就和按位或和按位与的功能有有所不同。 

那按位异或的规则又是什么呢?我们在这里把它写下来。

^—— 两个数对应的二进制位相同则为0,不同则为1。

这里大家可以试着去尝试一下结果。

5.赋值操作符: 

接下来就是我们的赋值操作符——‘=’。相信这个操作符从大家开始接触数学的时候就已经见到过了吧。只是和数学的等于号相比,我们的赋值操作符要有所不同,那么是在哪里不同?

首先就是我们的赋值操作符用法,它“人如其名”,存在的意义就是赋值。就像我们这里写的一个代码,它就是将我们的常数10赋值给我们的‘a’。我们也将其称之为初始化。这样我们打印出‘a’的值,输出的结果也就是10。

同时我们的赋值操作符也可以连续使用,就例如我们的这个图。

 我们的计算顺序是从右向左计算。也就是,我们先将y+1的值赋值给a,而后再将a的值赋值给x。但是这样写有些过于花里胡哨,而且一不小心还可能导致有些人因此看不懂代码所表达的意思,所以我们一般将它们分开来写。

这样子写就更加的通俗易懂。

而在C语言中除了有赋值操作符,我们又可以以赋值操作符为基础延伸出更多千奇百怪的复合赋值符,那么我们就将其整理为一张图片吧。

6.单目操作符:

在讲解完了赋值操作符和复合赋值符之后,接下来我们就要开始讲解众操作符的中一个比较重要的操作符——单目操作符

什么是单目操作符?在C语言中我们规定:

在该表达式中,只有一个操作数的式子被我们,它的操作符被我们称为单目操作符。 

在这些单目操作符中,在前面的博客中我们已经讲解过一部分,这里我就带大家重温一下单目操作符。

首先就是我们的逻辑反操作符——‘!’。 

逻辑反操作符的作用就是将我们的真变为假,将假变为真。 想直观的表达就是我们的分支语句来判断。

当a等于5的时候,打印haha。如果a不等于5则打印hehe。由此可见,在C语言中我们的逻辑反操作符充当着不等于的作用。 

借着我们的逻辑反操作符,因为逻辑反操作符是将真变为假,假变为真。那么我们就来拓展一个新知识——布尔类型

布尔类型: 

那么什么是布尔类型呢?我们将其简单的描述一下。

 布尔类型的在c99编译器中引入的,它是用来表示真假的类型。

那么在C语言中我们该如何去书写我们的布尔类型?接下来我们就写个代码来示范一下。 

在这里,我们就运用了布尔类型,将我们的‘flag’设定为假,‘num’设定为真。最后在分支语句进行判断即可 在第一个判断语句中‘flag’为假,所以不打印,在第二个判断语句中‘num’为真,所以进行打印,结束的时候我们可以看到我们的编译器打印了‘hehe’

注:使用布尔类型的时候要加入一个新的头文件。

同样的布尔类型也可以作为我们的函数返回类型,比如我们曾经做过的判断闰年的题目,我们就能用‘_Bool’来作为我们的返回类型。  

接下来就是我们的正值和负值操作符,这两个操作符就是简单的将正负,负值操作符就是将正数变为负数,将负数变为正数,除此之外没有什么要注意的地方。 

注:在写代码的时候,如果一个整形的类型是unsigned int,则这个整数被称为无符号数,这个整数没有负值。 

而后就是我们比较熟悉的取地址操作符——‘&’。 

取地址操作符可谓是从C语言开始就一直陪伴着我们,我们对它应该是再熟悉不过了。

那么讲到我们的取地址操作符就难免会联系到我们的‘*’

在我们的这个代码中,我们运用取地址操作符,将a的地址交给pa接收。而后再在打印的时候对我们的pa进行解引用,这样子就能得到我们的a的值。 

但是我们的取地址操作符也有一些需要注意的存在。

类似于这种操作符就是我们没有定义的操作符,是一种非法行为,是不能使用的。 

讲完了我们的取地址操作符后,我们就开始讲解我们的计算操作数字节长度的操作符——‘sizeof’。 

‘sizeof’是我们C语言中的操作符,也是我们C语言中的关键字, 因此我们不能随便的将‘sizeof’进行定义。而且它可计算的东西有很多,平常我们的变量大小和数组大小已不在话下,并且我们还可以通过‘sizeof’一个类型的大小

 

在函数调用的时候,我们一般将后面的数加上‘()’的括号,但是‘sizeof’就有所不同, 它的后面括号可以省略,由此可以看出它不是函数

但是有些值在‘sizeof’后面不加括号是无法运行的,就例如: ‘sizeof  类型’

 

与此同时,我们也可以用我们的‘sizeof’来计算数组的大小,这也是没问题的。 

 

当然在‘sizeof’中我们也有一些要注意的点,比如下面这个代码。

 

在这个代码中我们计算‘sizeof’的大小,但是我们这里的答案却是2。这是因为,‘sizeof’内部的表达式是不参与计算的。 又因为,虽然我们的x是整形,加上3后依旧是整形,但是我们这个时候要将它存放在一个短整型的a中,这个时候我们就要发生截断。最后的大小由a的类型决定。

我们这篇博客最后就再讲解一个操作符。

‘~’——取反操作符它的作用是对我们一个数的二进制位按位取反

在讲解我们的原码反码和补码的时候,我们会经历一个叫做符号位不变,其他位按位取反的操作。但是我们的取反操作符就和这条定理有所不同。在取反操作符中,我们的所有的二进制位,包括符号位都要参与取反的这个操作中去

类似我们的这个代码,经过原码反码和补码的了解,我们也知道0的补码是32个0,-1的补码是32个1。 由此可见在取反操作符进行的过程中我们的符号位也有进行取反。

 注:取反操作符只限于整形变量,浮点型不能用取反操作符。

结尾: 

在这篇博客我们讲解了C语言中的各种操作符,但是还是有些许操作符我们现在还没有讲到,我们会在下一篇博客中继续见面我们的操作符。 同时也希望这篇博客可以带你了解C语言中的操作符。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值