操作符详解(1)

大家好,今天我们来学习C语言中的操作符。
在这里插入图片描述
首先让我们看看操作符的种类。

操作符分类:

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

算数操作符:

一、“/”除号操作符
只有除法操作中两边是整数,才会执行整数除法,除法操作中,如果两边有一边有浮点数,才执行浮点数除法。除法的进行与操作数的类型无关。
【看到如下代码】

#include<stdio.h>
int main()
{
	int ret1 = 9 / 2;
	double ret2 = 9 / 2;
	double ret3 = 9 / 2.0;
	printf("%d\n", ret1);
	printf("%lf\n", ret2);
	printf("%lf\n", ret3);
	return 0;
}

在这里插入图片描述
看到程序运行的结果,我们发现两边的数字有浮点型时,才执行浮点型除法。

二、“%”取余操作符,顾名思义就是取余数。
【看到代码】

#include<stdio.h>
int main()
{
	int a = 9 % 2;
	printf("%d", a);
}

在这里插入图片描述
因为九除二的结果余数为一,所以运行的结果就为一。

三、算数操作符还包括“*”乘法操作符和“+”“-”加减法操作符,这几个操作符比较简单,想必大家都了解,所以就不进行讲解了。

算数操作符还有几点要注意的是:

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

移位操作符:

<< 左移操作符 >> 右移操作符
注:移位操作符的操作数只能是整数。

我们在进行移位操作符的时候要注意我们进行的是二进制的移位,什么意思呢,因为我们的是整数,整数有四个字节,三十二个比特位,这三十二个比特位都是二进制的,这三十二个比特位成为这个数的原码,在最前面的这个二进制位为符号位,0表示正,1表示负。如1的原码00000000000000000000000000000001,-1的原码为10000000000000000000000000000001,因为我们进行操作符运算的时候是对它的补码进行运算,所以我们还有将原码转化为补码。这里我们要注意的是正整数的反码和补码就是它的原码,而负数整的补码要先将它转化为反码,要想将它转化为反码,只需符号位不变,其他位按位取反,补码就是反码在加上1。看到下面的代码:

//a=-5
//原码 10000000000000000000000000000101
//反码 11111111111111111111111111111010
//补码 11111111111111111111111111111011

我们已经知道操作符是对它的补码进行操作,接下来就是让我们明白移位操作符的规则:

左移操作符:左边抛弃、右边补0
右移操作符:

  1. 逻辑移位左边用0填充,右边丢弃
  2. 算术移位左边用原该值的符号位填充,右边丢弃

接下来让我们看到代码:

int main()
{
	int a = 5;
	int b = a << 1;
	// a的补码 00000000000000000000000000000101
	//左移移位 00000000000000000000000000001010
	printf("%d\n", b);
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述
因为是二进制,b的值等于2的三次方加上2的一次方等于是10,但是a本身没有变化。

int main()
{
	int a = -5;
	int b = a >> 1;
	//a的原码 10000000000000000000000000000101
   //    反码 11111111111111111111111111111010
  //     补码 11111111111111111111111111111011
   //右移一位 01111111111111111111111111111101 或者11111111111111111111111111111101
	printf("%d\n", b);
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述
我们可以看到打印出来的结果是-3,虽然我们有两种移位方式,但是我们的编译器用的是算数移位。

:对于移位运算符,不要移动负数位,这个是标准未定义的。

位操作符:

& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。

1.& 按位于操作符
&:全是1为1,有0为0

代码如下:

int main()
{
	int a = 3;
	int b = -2;
	int c = a & b;
	//a的补码 00000000000000000000000000000011
	//b的原码 10000000000000000000000000000010
	//b的反码 11111111111111111111111111111101
	//b的补码 11111111111111111111111111111110
	//根据全1为1的原则
	//得到c的补码为00000000000000000000000000000010=2
	printf("%d", c);
	return 0;
}

在这里插入图片描述

2.| 按位或
|:有1为1,全0为0

【看到如下代码】:

int main()
{
	int a = 3;
	int b = -2;
	int c = a | b;
	//a的补码 00000000000000000000000000000011
	//b的原码 10000000000000000000000000000010
	//b的反码 11111111111111111111111111111101
	//b的补码 11111111111111111111111111111110
	//根据全1为1的原则
	//得到c的补码为 11111111111111111111111111111111
	//得到c的反码为 11111111111111111111111111111110
	//得到c的原码为 10000000000000000000000000000001=-1
	printf("%d", c);
	return 0;
}

在这里插入图片描述

在这里我们要注意通过位操作符得到的补码如果符号位为0,那么它的原码就是补码,如果它的符号位为一,那么就得先减一得到反码,在符号位不变按位取反得到原码,计算出结果。或者再次符号位不变按位取反在加上一也可以得到原码。

3.^按位异或
^:相同为0,不同为1

代码如下:

int main()
{
	int a = 3;
	int b = -2;
	int c = a ^ b;
	//a的补码 00000000000000000000000000000011
	//b的原码 10000000000000000000000000000010
	//b的反码 11111111111111111111111111111101
	//b的补码 11111111111111111111111111111110
	//根据全1为1的原则
	//得到c的补码为 11111111111111111111111111111101
	//得到c的反码为 11111111111111111111111111111100
	//得到c的原码为 10000000000000000000000000000011=-3
	printf("%d", c);
	return 0;
}

在这里插入图片描述

赋值操作符

例如:

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值

还有复合赋值符:
例如:
+= <<=
-= >>=
/= *=
举个例子:

int x = 10;
x = x+10;
x += 10;//复合赋值

这是第一小节的内容,谢谢大家。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lehjy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值