【C语言】操作符详解(1)

本文详细介绍了计算机编程中的各类操作符,包括算数操作符、移位操作符和位操作符等,并通过实例演示了它们的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作符的定义

指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。

操作符分类

算数操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号
下标引用,函数调用和结构成员

详解(1)

算数操作符

算数操作符包括 + - * / %,分别表示加减乘除以及取模。
因为电脑键盘无法表示出我们数学中使用的乘号除号,所以用*表示乘,用/表示除。
这些符号的用法都与我们做数学题的用法是一样的,在这之中,/和%有需要注意的地方。
我们小小的计算一下10除以4,

int main()
{  
   int b=0;
   b=10/4;

   printf("b = %d",b);

   return 0;
}

显然,这个计算结果是2.5,那么程序跑起来之后输出的是什么呢?
在这里插入图片描述
是2,不是我们预想的结果,为什么呢?
整型整型,你用的是整型!哦原来是这样,那我们改成double类型的,

int main()
{
	double b = 0;
	b = 10/ 4;

	printf("b = %fl", b);

	return 0;
}

可以发现,输出结果是2.000000,还不是我们想要的结果,为什么呢?
除号会根据两边的数字来决定进行什么计算,当两边都是整数时,他会进行整式运算,输出结果无论你用的什么类型都是整数,如果想让他进行小数运算,只要让他两边任意一个数字变成小数即可,

int main()
{
	double b = 0;
	b = 10/ 4.0;

	printf("b = %fl", b);

	return 0;


int main()
{
	double b = 0;
	b = 10.0/ 4;

	printf("b = %fl", b);

	return 0;

%的作用是取模,也就是取余数,10除3得3余1,%就将这个1取过来。%要注意的是他的两边必须都是整数,不能是小数。
在这里插入图片描述

int main()
{
	int b = 0;

	b = 10 % 3;

	printf("b = %d", b);

	return 0;
}

改成小数后,
在这里插入图片描述
无法运行程序。

移位操作符

移位操作符包括<<和>>,箭头朝向哪边就叫什么移操作符,<<为左移操作符,>>为右移操作符,我们知道,数字在内存中是以二进制的形式存储的,比如1,他对应的二进制数是01,而在内存中,00000000000000000000000000000001才是他的二进制序列,移位操作符的作用就是让这么一大串数字向左或向右移动多少位。

int main()
{
	int a = 1;

	a = a << 1;

	printf("a = %d", a);

	return 0;
}

这是1向左移动一位的代码,
移位1
这就是移位的具体内容,左边多了一个0,右边空出一个位,此时就要将0补在空位上,此时,数字的二进制序列变成了
00000000000000000000000000000010
这个数字是2,也就是1向左移位1,得到的结果是2,是这样吗?我们来看看。
在这里插入图片描述
对了,确实是2.这就是移位操作符的应用。
对于右移操作符,他有两种右移方式,一种是算术右移,一种是逻辑右移
算术右移是把右边多出来的数字补到前面的空位上,逻辑右移是把多出来的数字丢掉,前面补0。
如果是算术右移,那么将3右移1位,
3的二进制序列是00000000000000000000000000000011,
右移一位,右边多出来的1放在最左边的符号位上,此时的二进制序列变成了
10000000000000000000000000000001
这个表示-1,最左边是符号位,符号位是1,则该数是负数,0则为正数。

int main()
{
	int a = 3;

	a = a >> 1;

	printf("a= %d", a);

	return 0;
}

在这里插入图片描述
结果是1,把0补充在首位,这里是逻辑右移。

位操作符

位操作符包括
按位与 &
按位或 |
按位异或 ^
按位与的作用是,将两个数对应的二进制序列一一对应,有0的取0,全是1才能取1,比如这个:
00000000000000000000000000000011
00000000000000000000000000000101
这两个数分别为3和5,3&5,结果是多少呢?按照我们上面说的规则,这两串只有最后一位都是1,那么最后的二进制序列是
00000000000000000000000000000001
结果是1.
我们来看看是否是这样:
位1
接下来是按位或|
他是将两个序列对应,有1就是1,没1才是0
还是3和5
00000000000000000000000000000011
00000000000000000000000000000101
按位或之后就是:
00000000000000000000000000000111
三个一,结果是7
验证一下
位2
最后则是按位异或^
要注意,在计算器中我们计算某数的次方时,连接两个数的符号就是他,但他并不是次方符号。
他的用法是相同为0,相异为1
继续
00000000000000000000000000000011
00000000000000000000000000000101
结果是
00000000000000000000000000000110
是6,验证
在这里插入图片描述
具体就介绍到这里,操作符的内容比较多,分成3节去说。
下面是一道题目
a=3,b=5,不使用其他变量,交换a和b的值
我们知道,交换两个变量的值,要引入一个空变量,就想我们将一瓶酱油和一瓶醋交换瓶子一样,我们得再拿一个空瓶子,先把酱油倒进空瓶,再把醋倒进酱油瓶,再把酱油倒进原来的醋瓶,这样就完成了两个瓶子的交换,交换a和b的值,也要用一个空瓶子。

int main()
{
	int a = 3, b = 5;

	int c = 0;
	printf("a= %d b= %d\n", a, b);
	c = a;
	a = b;
	b = c;

	printf("a= %d b= %d\n", a, b);

	return 0;
}

如上,就是使用变量的方法,
在这里插入图片描述
在不使用变量的情况下,我们观察可以发现,
a+b=8
那么 我们就可以使用算式来将这两个数进行交换
a=a+b=3+5=8
b=a-b=8-5=3
a=a-b=8-3=5
这样也实现了两个数的交换
w
但这样有个弊端,会溢出,当数字大到一定程度,程序便无法运作,如何解决?
这里就要使用我们这一节学的操作符
3的序列是011,5是101,
两个异或一下,
011
101
得到
110,再与其中一个异或一下,比如5
101得到
011
我们发现,又得到了3
像这样多次异或,就可以将两个数的值进行交换且不使用其他变量,且不会溢出

int main()
{
	int a = 3, b = 5;

	int c = 0;
	printf("a= %d b= %d\n", a, b);

	a = a ^ b;
	b = a ^ b;
	a = a ^ b;

	printf("a= %d b= %d\n", a, b);

	return 0;
}

在这里插入图片描述
可以看到,两个数的值成功交换,再仔细观察一下,
a=a^b
b=a^b
就相当于
a ^ a ^ b
也就是说,两个a异或的值与b异或得到了b,这里就是一个结论,
两个相同的数异或,为0
一个数与0异或,得到他本身
a ^ a =0,
0 ^ b=b,这个方法的原理就是这样了。

=========================================================================================================
此次内容到此结束,感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒世伞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值