【C语言】操作符详解

一、前言

操作符(Operator)是编程语言中用于执行操作的符号,它们告诉编译器或解释器如何操作数据。在编程中,操作符用于对变量、值、对象或函数执行特定的作,C语言中提供了各种个样的操作符,下面我们会一一讲解。


二、操作符详解

1. 操作符的分类

算术操作符:+ 、- 、* 、/ 、%
移位操作符:<< >>
位操作符:& 丨 ^
赋值操作符:= 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、
单目操作符:!、++、–、&、*、+、-、~ 、sizeof、(类型)
关系操作符:> 、>= 、< 、<= 、 == 、 !=
逻辑操作符:&& 、丨丨
条件操作符:? :
逗号表达式:,
下标引用:[]
函数调用:()
结构成员访问:. 、->

2. 算术操作符

+ : 加法
- : 减法
* : 乘法
/ : 除法
% :取余

算数运算符比较简单,这里我们用代码来演示一下用法就可以了

#include <stdio.h>

int main() {
	int a = 10;
	int b = 5;

	printf("%d + %d = %d\n", a, b, a + b);
	printf("%d - %d = %d\n", a, b, a - b);
	printf("%d * %d = %d\n", a, b, a * b);
	printf("%d / %d = %d\n", a, b, a / b);
	printf("%d %% %d = %d\n", a, b, a % b);

	return 0;
}

在这里插入图片描述


3. 移位操作符

(1) 原码、反码、补码

原码、补码和反码是计算机科学中用于表示整数的二进制编码方式,特别是在处理有符号整数时。这些编码方式主要用于简化计算机中的算术运算

  • 有符号整数的三种表示方法均有符号位数值位两部分,2进制序列中,最高位的1位是被当做符号
    位,剩余的都是数值位,符号位都是用0表示“正”,用1表示“负”
  • 正数、无符号整数的原码、反码、补码都相同;负数的原码、反码、补码都不同

原码: 直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码: 将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码: 反码+1就得到补码
补码得到原码也是可以使用:取反,+1的操作
计算机中存放整形数据存放的是整形数据的补码,原因:使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

	int a = 10;
	int b = -10;

	00000000 00000000 00000000 00001010 // a的原码
	01111111 11111111 11111111 11110101 // a的反码
	01111111 11111111 11111111 11110110 // a的补码

	10000000 00000000 00000000 00001010 // b的原码
	11111111 11111111 11111111 11110101 // b的反码
	11111111 11111111 11111111 11110110 // b的补码

(2) 左移操作符 <<

左移操作符是对数据原码的移动,移动规则:左边抛弃、右边补0 ,下面我们举个例子展示

#include <stdio.h>
int main() {
	int a = -10;
	int b = a << 1;

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

	return 0;
}

在这里插入图片描述
下面我们画图展示一下左移的过程

在这里插入图片描述


(3) 右移操作符 >>

右移操作符移动的也是整形的补码,右移分为两种,一种是 逻辑右移,另一种是 算术右移

逻辑右移

逻辑右移规则: 左边用0填充,右边丢弃,一般用于无符号整数

#include <stdio.h>
int main() {
	unsigned int a = 10;
	unsigned int b = a >> 1;

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

	return 0;
}

在这里插入图片描述
在这里插入图片描述

算术右移

算术右移规则: 左边用符号位填充,右边丢弃,一般用于有符号整数

#include <stdio.h>
int main() {
	int a = -10;
	int b = a >> 1;

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

	return 0;
}

在这里插入图片描述
在这里插入图片描述
注: 无论是左移还是右移,移动的位数必须是整数,而且是正整数


4. 位操作符

  • &: 按位与
  • |:按位或
  • ^: 按位异或
  • ~ 按位取反

按位操作符&、|、^均是两个数进行操作,而~操作符是对单个数进行操作,下面我们对这些操作符进行讲解

  • & (按位与),将两个数的数的二进制位对比,全为1为1,不同为0
  • | (按位或),将两个数的数的二进制位对比,有1则为一,全0才为0
  • ^ (按位异或),将两个数的数的二进制位对比,不同为1,相同为0
  • ~ (按位取反),对每一个二进制位取反,1变成0,0变成1

下面我们直接看代码

#include <stdio.h>
int main()
{
	int num1 = -3;
	int num2 = 5;
	printf("%d\n", num1 & num2);
	printf("%d\n", num1 | num2);
	printf("%d\n", num1 ^ num2);
	printf("%d\n", ~0);
	return 0;
}

在这里插入图片描述
下面我们画图展示一下过程:

在这里插入图片描述


5. 赋值操作符

  • = : 赋值操作符
  • += : 加等于
  • -= : 减等于
  • *= : 乘等于
  • /= : 除等于
  • %= : 取模等于
  • <<= : 左移等于
  • >>= : 右移等于
  • &=: 按位与等于
  • |= : 按位或等于
  • ^= : 按位异或等于

我们先说 += 这个操作符,比如:a += 10,就是a = a + 10 的意思,就是进行操作后赋值给自身,其他的操作符也是如此


6. 单目操作符

  • ! : 取反
  • ++ : 递增
  • – : 递减
  • & : 取地址
  • (*) 解引用
  • + : 正号
  • - : 减号
  • ~ : 按位取反
  • sizeof : 计算字节大小
  • (类型) : 强制类型转换
#include <stdio.h>
#include <stdbool.h>
int main()
{
	int a = 0;
	int* pa = &a;
	if (!false) {
		printf("false取反\n");
	}
	printf("%d\n", ++a);
	printf("%d\n", --a);
	printf("%p\n", pa);
	pritnf("%d\n", *pa);
	printf("%d\n", +a);
	printf("%d\n", -a);
	printf("%zd\n", sizeof(a));
	printf("%lf\n", (double)a);
	return 0;
}

在这里插入图片描述
这些操作符演示一遍即可


7. 关系操作符

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

关系操作符用在判断上,表示的是判断关系,可以看以下代码

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 1;
	if (a == b) {
		printf("a 等于 b\n");
	}
	if (a > b) {
		printf("a 大于 b\n");
	}
	if (a < b) {
		printf("a 小于 b\n");
	}
	if (a >= b) {
		printf("a 大于等于 b\n");
	}
	if (a <= b) {
		printf("a 小于等于 b\n");
	}
	if (a != b) {
		printf("a 不等于 b\n");
	}

	return 0;
}

在这里插入图片描述


8. 逻辑操作符

  • && :
  • || :或

逻辑操作符用于多重关系的比较,可以看以下代码

#include <stdio.h>
int main()
{
	int b = 1;
	if (b > 0 && b < 10) {
		printf("b 大于 0 且小于 10\n");
	}
	if (b > 0 || b < -2) {
		printf("b 大于 0 或者 b 小于 -2\n");
	}

	return 0;
}

在这里插入图片描述
注: 进行 比较时,当 第一个条件不满足 时则不会进行第二个条件的比较;进行 比较时,当 第一个条件 满足 时,将不会进行第二个比较


9. 条件操作符

条件操作符又称三目操作符,它的语法如下:

result = condition ? result1 : result2;
或
condition ? 语句 : 语句;
  • condition 是一个布尔表达式。
  • 如果 condition 为真,result 将被赋值为 result1。
  • 如果 condition 为假,result 将被赋值为 result2。

我们直接看代码

#include <stdio.h>
int main()
{
	int b = 1;

	int returnNum = b > 10 ? 1 : 0;
	printf("%d\n", returnNum);

	b > 10 ? printf("Yes\n") : printf("No\n");

	return 0;
}

在这里插入图片描述


10. 逗号表达式

exp1, 1 exp2, exp3, …expN

注: 逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);

	printf("%d\n", c);

	return 0;
}

在这里插入图片描述


11. 下标引用

操作数:一个数组名 + 一个索引值(下标)

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

三、操作符的属性:优先级、结合性

1. 优先级

优先级指的是,如果一个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不一样的

如下:

#include <stdio.h>

int main() {
	int a = 5 - 3 * 2;
	printf("%d\n", a);

	return 0;
}

在这里插入图片描述
如图,这里先运算了3乘于2

2. 结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )

5 * 6 / 2;

上面示例中, * 和/ 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算5 * 6 ,再计算/ 2

四、End

关于操作符的详解我们就说到这里,谢谢大家阅读,希望对大家有用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值