操作符详解(纯小白进来,保姆级资料,包学废的)

一、 前言

在C语言中,操作符(Operators)是用于执行各种操作的符号。操作符在C语言编程中非常重要,因为它们是构建表达式和控制程序逻辑的基础。

二、 操作符分类

1、算术操作符

用于执行基本的数学运算。

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(取余数)

vs演示如下:
在这里插入图片描述注意:

1.对于/操作符如果两边都是整数,那执行整数除法,如果至少有一个浮点数就执行浮点数除法。

2.%操作符是取余数。而且符号两边只能是整数,而其他操作符可以作用于整数和浮点数。

2、关系操作符

用于比较两个值,返回布尔值(1 表示真,0 表示假)。

  • ==:等于
  • !=:不等于
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于

这些关系运算符比较简单,但是我们要注意一些运算符使用时候的陷阱。
警告: 在编程的过程中== 和=不小心写错,导致的错误。

3、位操作符

用于对整数的二进制位进行操作。

  • &:按位与
  • |:按位或
  • ^:按位异或
  • ~:按位取反
  • <<:左移
  • >>:右移

3.1 、按位与

按位与规则:有0为0,全1为1

例如:
在这里插入图片描述
分析如图

3.2、 按位或

按位或规则:有1为1,全0为0

例如:
在这里插入图片描述

分析如上图

3.3、 按位异或

按位异或规则:不同为1,相同为0

例如:
在这里插入图片描述
分析如上图

扩展:按位异或还有以下三个特征

1.a^a == 0

2.0 ^ a == a

3.按位异或支持交换律

3.4、 按位取反

按位取反规则:二进制位按位取反,~1=0, ~0=1

举例:

A = 0011 1100

~A = 1100 0011

3.5、 左移操作符

左移操作符的规则:左边抛弃,右边补零。(在计算机中数据的保存都是以*二进制补码(大致了解)的形式,所以我们移动的是二进制数)

在这里插入图片描述

我们可以看到num左移一位之后,左边溢出了,溢出了我们就抛弃,在最右边补零,最后变成了18。
vs验证:
在这里插入图片描述

图片中在内存中的地址和数值是用16进制表示的,前边是地址后面是数值,数值是倒着存放的,我们可以看到num开始的时候是9,左移一位变成16进制的12也就是十进制的18。

3.6、 右移操作符

右移操作符分为两种,一种是算数右移,一种是逻辑右移

算数右移的规则:左边用原符号位填充,右边抛弃

逻辑右移的规则:左边补零,右边抛弃

其中逻辑右移与前边讲的左移操作类似,主要看一下算数右移

有符数分为正数和负数,它们的符号位分别为:

正数----0

负数----1

也就是说如果正数进行算数右移的话,应该是右边丢弃,左边补0

负数进行算数右移的话,应该是右边丢弃,左边补1
简记左边补符号位

vs代码验证:
在这里插入图片描述

注意:对于移位操作符,不能移位负数,这是为定义的不合法的

b = a<<-1; //这里是不合法的

4、 赋值操作符

赋值操作符 = 就是给变量赋值的,可以把我们想要的数值赋给变量。

比如我的薪资是6000元每月

int salary=180

不满意的话可以重新赋值为10000,

salary= 10000;

连续赋值

x=y=5+2;

这个就相当于

y = 5+2;

x = y;

5、 复合赋值操作符

加等:+=
减等:-=
乘等:*=
除等:/=
取余等:%=
右移等:>>=
左移等:<<=
按位与等:&=
按位或等:|=
按位异或等:^=

例如:

a+=2;

等同于

a=a+2;

//其他复合赋值操作符是同种效果,这里就不一 一举例了,起简化代码的作用。

6、 sizeof 操作符

用于获取数据类型或变量的大小(以字节为单位)。
sizeof(类型名),类型名也可以是变量的名字。

sizeof在使用时也可以不带(),但是在书写的时候为了更好的代码规范还是最好写上,所以sizeof其实是一个操作符。
注意:只有在用变量名时才能省略(),其他情况不能省略。

sizeof在涉及数组时要注意
在这里插入图片描述
猜一下马赛克部分分别输出的是什么?
32位机器:(1)40 (2) 4 (3) 10 (4)4
64位机器:(1)40 (2) 8 (3) 10 (4) 8

7、 自增和自减操作符

用于增加或减少变量的值。

  • ++:自增(a++++a
  • --:自减(a----a

在这里插入图片描述

8、 逻辑操作符

  • &&:逻辑与(两个条件都为真时返回真)
  • ||:逻辑或(两个条件中有一个为真时返回真)
  • !:逻辑非(取反,真变假,假变真)

C语言中零表示假,非零表示真。

区分逻辑与和按位与 区分逻辑或和按位或

按位与和按位或作用的是二进制位,而逻辑与和逻辑或作用的是表达式的真假。

栗子:

1&2----->0
1&&2---->1
1|2----->3
1||2---->1

逻辑与和逻辑或都有短路这一特点,如果左边的值可以确定整个逻辑表达式的值右边就不再计算了。
例子:
在这里插入图片描述
答案:
在这里插入图片描述
通过·运行结果可以看到只有a自增1了,其他的自增都没有执行,这就体现了逻辑与的短路,因为a是后置++,先使用a=0,逻辑与有假为假,所以右侧的++b不用计算也知道a++&&++b的值为0 ,所以++b就被短路了,没有执行,后边的d++也是一样。

9、 条件操作符

也称为三元操作符,用于根据条件选择不同的值。

  • ? ::条件操作符(condition ? expr1 : expr2
    运算规则:表达式1的值为真,结果就为表达式2的值,为假,结果就为表达式3的值
if(a>5)
  b=3;
else
  b=-3;
//转换为条件表达式,是什么样?

答案:a>5?b=3:b=-3;

我们可以看到一些简单的if else语句可以用条件操作符替代来简化代码。

10、逗号表达式(exp1,exp2,exp3,……)

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

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
//c的值为多少

有的人认为c的值为2,但其实是13,虽然逗号表达式的结果为最后一个表达式的结果,但是前面表达式的结果对后面表达式的值也有影响。

逗号表达式也有简化代码的作用
在这里插入图片描述

11、指针操作符

用于指针操作。

  • *:间接寻址操作符(用于声明指针和解引用指针)
  • &:取地址操作符(用于获取变量的地址)

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

12、成员访问操作符

用于访问结构体或联合体的成员。

  • .:点操作符(用于直接访问结构体成员)
  • ->:箭头操作符(用于通过指针访问结构体成员)

当我们创建了一个结构体变量时,我们想访问里面的成员变量就可以使用 . 来访问,当我们通过函数把地址传给结构体指针时,可以通过->来访问成员变量。

例如:
在这里插入图片描述

13、 强制类型转换操作符

用于显式地转换数据类型。

  • (type):强制类型转换((int)x

使用如下:
在这里插入图片描述

14、 其他操作符

  • []:数组下标操作符
  • ():函数调用操作符

14.1、 数组下标操作符:

int arr [ 10 ]; // 创建数组 arr [ 9 ] = 10 ; // 实用下标引用操作符。 [ ] 的两个操作数是 arr 和 9 。

14.2、 函数调用操作符:

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
在这里插入图片描述

三、 操作符的属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。 两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

但是就算我们知道了操作符的优先级,我们还是不能准确的判断表达式的结果。

例子如下:

一些问题表达式

代码1:a * b + c * d + e * f

注释:代码1在计算的时候,由于比+的优先级高,只能保证的计算是比+早,但是优先级并不能决定第三个*比第一个+早执行。
所以表达式的计算机顺序就可能是:

ab
c
d
ab + cd
ef
a
b + cd + ef
或者:
ab
c
d
e* f
ab + cd
ab +cd + e*f

代码2:c + --c;

注释:同上,操作符的优先级只能决定自减–的运算在+的运算的前面,但是我们并没有办法得知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。

通过上边的几个例子可知就算知道了优先级,有些表达式也是不能确定的的,所以我们以后写代码,避免写问题代码,把表达式写的简洁好理解,可以使用括号来确定运算顺序。

操作符优先级表
在这里插入图片描述

四、 总结

C语言中的操作符种类繁多,每种操作符都有其特定的用途。熟练掌握这些操作符对于编写高效、简洁的C语言代码至关重要。通过合理使用这些操作符,可以构建复杂的表达式和控制结构,实现各种功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值