C语言中的操作符上(详细)


前言

C语言提供大量的操作符,丰富的操作符使C语言变得非常灵活。今天我就为大家详细地介绍下操作符的种类,它们各自的作用以及需要注意的点

文章于2022年11月12日修改一次


操作符

一.算术操作符

算术操作符有+、-、*(乘)、/(除)、%(取余)
注意

  1. C语言中的乘号和除号不同于数学中×和÷。
  2. %操作符表示前操作数除以后操作数得到的余数,而不是
  3. /操作符的两个操作数如果都是整数,那么它执行的是整数的除法,如果其中至少有一个操作数是浮点数,那么它执行的是浮点数的除法在这里插入图片描述

%f打印float类型的浮点数,%lf打印double类型的浮点数,而\n表示换行,它是转义字符,在接下来的博客中会有介绍

  1. 算术操作符中除了%的操作数必须是整数外,其他操作符的操作数可以是整数,也可以是浮点数

二.移位操作符

<<(左移)和>>(右移)
表示一个数的二进制位左移和右移

先在这里给大家简单介绍下有符号数二进制的符号位,一般地,二进制的最高位表示符号位,1表示负,0表示正。无符号数没有符号位,所以没有正负之分。在这里插入图片描述

1.原码、反码、补码的认识

  1. 整数的二进制表示形式有3种:原码,反码,补码。
  2. 一个整形有4个字节(32个比特),所以它的二进制位有32个。
  3. 原码:按照一个数的正负,直接写出它的二进制表示形式得到的就是原码。
    计算机区别正负数是根据它们的原码中的符号位。在这里插入图片描述

最高位为0表示正数,最高位为1表示负数。

  1. 正数的原码、反码、补码相同,负数的原码、反码、补码要经过计算才得到。
    在这里插入图片描述

  2. 反码:符号位不变,其他位按位取反就是补码。在这里插入图片描述

  3. 补码:反码加一
    在这里插入图片描述
    在这里插入图片描述

  4. 为什么要了解原码,反码,补码?
    数据在内存中以二进制的补码的形式存储,所以在参与移位的过程中移动的是补码

  5. 我们来看个例子:-1在内存中的存储的是补码。
    在这里插入图片描述
    我们在调试中打开窗口,然后打开内存,点击一行显示4列。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

数据在内存中以二进制的形式存储,但以十六进制的形式展示,主要是由于二进制太长了。

一个字节等于两个16进制位,一个16进制位等于4个比特位等于4个二进制位,图中一个f等于四个二进制位1111,而八个f等于11111111111111111111111111111111。
有内存中展示的16进制可以看出-1在内存中存储的是它的补码。

2.左移操作符

首先介绍下左移,假设一个数的二进制有八位,当让它向左移动3位时,左边三位就丢弃,右边多出来的几个空位由0补齐。
##在这里插入图片描述

当我们进行多次左移后发现一个规律:**左移有2的效果,左移一位,原来的数字就2。

3.右移操作符

右移操作符则面临着左移操作符未曾面临的问题。当一个数的二进制位右移时,它的左边补位有两种方案:一种是逻辑移位,即左边移入的是0;另一种是算术移位,左边移入的位由这个值的原先符号位决定,原先符号位是0就补0,原先符号位是1就补1。
在这里插入图片描述
注意
有符号数右移采用的是算术右移,而无符号数采用是逻辑右移。

三.位操作符

&(按位与)、|(按位或)、^(按位抑或)
实际上进行的还是二进制的操作,从而达到改变一个数的作用

  1. 两个数进行&操作,它们的对应的二进制位全部为1,得到的结果才是1,也可以理解为有0便为0。在这里插入图片描述
  2. 两个数进行|操作,它们对应的二进制位有一个为1,结果便为1。

在这里插入图片描述
3. 两个数进行^操作,它们对应的二进制位相同得到的数就是0,不同得到的数就是1。在这里插入图片描述

注意位操作符的操作数都是整数

一道变态的面试题
不创建临时变量(第三个变量),实现两个整数的交换。
法一:

int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;

缺陷:当a和b过大,它们的和可能会溢出。
法二:

int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;

我们先来了解下异或操作符的两个特殊的公式:

  1. a ^ a = 0
    相同为0,相异为1,本身和本身异或肯定相同,所以为0。
  2. a ^ 0 = 0
    0的二进制位都为0,但一个数与0异或就会等于它本身。
  3. 异或支持交换律
    3 ^ 3 ^ 5 == 3 ^ 5 ^ 3,直接算出了即可证明两边相等。
    解读
    了解完它的两个特点后,相信你就明白这道题的本质了。
a = a ^ b;
b = a ^ b;//可换成b = a ^ b ^ b =a ^ 0
a = a ^ b;//可换成a = a ^ a ^ b =b ^ 0

四.赋值操作符

=
就是把等号右边的值赋给左边的变量

当有多个赋值操作符时要考虑操作符的结合性(类似于计算的顺序)。在这里插入图片描述

计算顺序就是从右到左,把y+5赋给x,再把x赋给num。

在后面附有操作符的结合性和优先级表


五.复合操作符

+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=

举个栗子
在这里插入图片描述
在这里插入图片描述

a + =1;//读作把1加给a,功能等于a = a+1
a - =1;//等于a = a-1
a * =1;//等于a = a*1
以此类推
a ^ =1;//等于a = a^1
  1. a +=1和a = a+1这两种书写方法的不同之处就是前者a只计算一个,后者a先+1,再把a+1的值赋给a。
  2. 当a是一段复杂的表达式时,用复合操作符可以减少打字出错的概率,而且用复合操作符的执行效率更高,所以推荐多使用复合操作符

六.单目操作符

单目操作符只有一个操作数
!、++、–、~、&、*、sizeof、-、+、()

  1. !逻辑反操作符
    !操作符对它的操作数进行逻辑反操作。当操作数是真时,就返回假,也就是0;当操作数是假时,就返回真,也就是1。
    注意 (1)在C语言中0表示假,非0表示真但在这个操作符中返回真表示1,并不意味着真只是1
    (2)!的操作数必须是整形
    拓展布尔类型

布尔类型就是用来表示真假的类型。
头文件是#include<stdbool.h>。
布尔类型的只有ture和false两种取值。ture本质是1,false本质是0。

例子
在这里插入图片描述

  1. -和+
    -操作符产生操作数的负值,+操作符感觉就是为了个-操作符凑一对。
  2. &和 *,称为取地址操作符和简介访问操作符
    &操作符表示取出某个变量的地址,并把它存在指针变量中,*操作符表示对指针进行解引用,访问指针指向的内容。这个后面会重点讲,不急
int a = 1,c = 2;
int *b = &a;//取出a的地址,放在b中,
            //b就是一个指针变量,指向a的地址
            //这里的 int* 表示b是一个整形指针,指向一个整形 
c = *b;//这里的 * 表示对b进行解引用,访问b所指向的内容
       //b指向的内容是a的值
       //所以c等于1            
  1. sizeof(操作数)操作符返回操作数的类型的大小,单位是字节
    在这里插入图片描述

n的类型是整形,整形的大小是4个字节,sizeof返回4。
(1). 当然,sizeof的操作数不仅可以是变量,也可以是类型名在这里插入图片描述
(2). 当sizeof()的操作数是数组名时,数组名不表示首元素地址,表示的是整个数组
数组的每个元素的类型是int,一共有10个,所以sizeof返回int*10在这里插入图片描述

sizeof(arr)和sizeof(int [10])的结果相同,类似于sizeof(a)和sizeof(int)也相同,a和arr是变量名/数组名,int [10]和int是类型。

(3). sizeof()括号内不进行运算(重点)

在这里插入图片描述

sizeof只看表达式结果的类型,不对表达式进行计算,

  1. ++和–(重点)
    ++包括前缀++和后缀++。前缀++放在操作数前,表示先对操作数进行+1操作,然后返回操作数+1后的值,再进行各种运算;后缀++放在操作数后,表示先对操作数进行运算,再进行+1操作,再返回操作数+1后的值。简单地讲就是前缀++先+1再使用,后缀++先使用再+1
    –的工作原理和++相同。在这里插入图片描述
    注意++和–的结果只是一份变量的拷贝,你不能对一个值进行赋值
    在这里插入图片描述

  2. ()操作符,称为强制类型转换。
    一般位于变量前,可以把变量的值转换成其他类型,()内加入你想要转换的类型。例如,你想得到一个整形值转换成一个浮点型值

(float)a;

由于()的优先级一般高于其中操作符的优先级,所以如果你想对一个表达式的结果进行强制类型转换的话,得用括号把整个表达式括起来,否则只会改变第一个变量的类型

(float)(a+b*c-d/e)

以上就是今天要讲的内容,本文仅仅简单介绍了C语言的部分操作符,后续会马上补上。如果里面有错误,请麻烦指出来,我会积极改正。
感谢您的阅读!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值