【C语言】操作符


㊙️小明博客主页:➡️ 敲键盘的小明 ㊙️
✅关注小明了解更多知识☝️



前言

提示:本篇文章为C语言操作符的详细笔记和完整的源码,内容如若有误,请联系小明及时更正。

  • 转载请注明原创,谢谢。

在这里插入图片描述

提示:以下是本篇文章正文内容:

一、什么是操作符 ?


  操作符是一种符号,用于表示数学运算或逻辑运算。在C语言中,操作符分为算术操作符、赋值操作符、逻辑操作符、条件操作符和单目操作符等等 。

  在C语言中,操作符的地位可谓是举足轻重,它们就像是语言中的“ 指挥棒 ”,引导着数据如何流动、如何变换。如果把C语言比作一支交响乐团,那么操作符就是乐团中的指挥家,他们掌控着整个乐团的节奏和旋律。


二、操作符的分类


1. 算术操作符
2. 移位操作符
3. 位操作符
4. 赋值操作符
5. 单目操作符
6. 关系操作符
7. 逻辑操作符
8. 条件操作符
9. 逗号表达式
10. 下标引用、函数调用和结构成员


三、操作符详解

  有了上面关于操作符的详细划分,就让我们来细细的研究一下不同操作符的使用方法吧:

3.1 算术操作符

+  -  *  /  %

  首先加减乘除这四个操作符想必大家都会使用,小明在这里就不赘述使用方法了,但还是给大家看一下代码效果:

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

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

	return 0;}

在这里插入图片描述
  其次,这里需要强调的是,/ 取商 (除) 操作符两边的数字都是整数的话,其结果也为整数,如若有一个是浮点数时,其结果也是浮点数,并且除数不能为零。
在这里插入图片描述

% 取余(模) 操作符用于计算两个整数相除后的余数。

int main()
{
	int a = 1024;
	int b = 3;
	int c = a % b;

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

	return 0;
}

在这里插入图片描述

🔴注1:

  • 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  • % (取余) 操作符的两个操作数都必须为整数。其返回的是整除之后的余数

  通常情况下我们判断一个数的奇偶就可以用取余来判断,如果输入的数字可以被 2 2 2 整除,说明是偶数(双数) ,如果没有被整除,说明是奇数 (单数) :

int main()
{
	int n = 0;
	while (scanf("%d", &n) != EOF)
	{
		if (n%2 == 0)
		{
			printf("%d 是偶数\n", n);
		}
		else
		{
			printf("%d 是奇数\n", n);
		}
	}

	return 0;
}

在这里插入图片描述

🔴注2:

  • 取余运算结果的符号与第一个操作数符号相同
int main()
{
	int n = 0;
	int m = 0;
	while (scanf("%d %d", &n, &m) != EOF)
	{
		printf("%d\n\n", n % m);
	}

	return 0;
}

在这里插入图片描述



3.2 移位操作符

  C语言中,移位操作符是用于对整数的二进制位进行左移或右移操作的。移位操作符在处理位级别的操作或优化内存使用时是非常有用的。

C语言中有两种移位操作符:

  • 左移操作符(<<)
  • 右移操作符(>>)

🚫警告:

  • 移位操作符的操作数必须是整数!并且不可以移动负数位 !!!

3.2.1 左移操作符(<<)

  将操作数二进制的所有位向左移动指定的位数左移几位,右边补几个0 而左边溢出的两位则舍弃。

例如:13 << 2:

在这里插入图片描述
效果如下:
在这里插入图片描述
🔴注:

推论:
m左移n位,其值为: m ∗ 2 n m*2^n m2n


3.2.2 右移操作符(>>)

  将操作数二进制的所有位向右移动指定的位数右移几位,左边补几个0 而右边溢出的两位则舍弃。

例如: 56 >> 3:

在这里插入图片描述

效果如下:
在这里插入图片描述

🔴注:

推论:
m右移n位,其值为: m 2 n \frac{m}{2^n} 2nm



3.3 位操作符

  C语言中,位操作符是用于对整数的二进制位进行左移或右移操作的。移位操作符在处理位级别的操作或优化内存使用时是非常有用的。

C语言中的位操作符:

  • 按位 & (与)
  • 按位 | (或)
  • 按位 ^ (异或)

注:和上面的移位操作符一样,操作数必须是整数!

3.3.1 按位 & (与)

  两个都是1,则&后结果是1;只要两个位里有一个是0,则&后的结果是0

在这里插入图片描述
为了显示效果更明显,这里的二进制只画了后8位。

得到了:15 & 7 = 7

代码效果如下:

int main()
{
	int a = 15;
	int b = 7;
	int ret = a & b;
	printf("a & b = %d\n", ret);

	return 0;
}

在这里插入图片描述


3.3.2 按位 | (或)

  两个只要有一个1,则 | 后结果是1;两个位都是0,则 | 后的结果是0

在这里插入图片描述
为了显示效果更明显,这里的二进制只画了后8位。

得到了:15 | 7 = 15

代码效果如下:

int main()
{
	int a = 15;
	int b = 7;
	int ret = a | b;
	printf("a & b = %d\n", ret);

	return 0;
}

在这里插入图片描述

3.3.3 按位 ^ (异或)

  两个位相同则 ^ 后结果是0;两个位不相同则 ^ 后的结果是1

在这里插入图片描述

为了显示效果更明显,这里的二进制只画了后8位。

得到了:15 ^ 7 = 8

代码效果如下:

int main()
{
	int a = 15;
	int b = 7;
	int ret = a ^ b;
	printf("a & b = %d\n", ret);

	return 0;
}

在这里插入图片描述

3.4 赋值操作符

3.4.1 赋值操作符

  由赋值运算符构成的表达式称为赋值表达式。赋值运算符将一个表达式的值赋值给一个变量。

  赋值运算符的左边只能是变量,不能是常量或者表达式。详解为:

  C编译器认为左值x的含义是x所代表的地址,这个地址只有编译器知道,在编译时确定,程序员不必考虑这个地址保存在哪里,所以左值必须对应着内存地址单元,即:左值可以是变量、数组的某个单元或指针等,但不能是常量或者表达式,否则会出现错误,如:

x = 2 + 3;
x + 1 = 2 + 3; //错误
*p = 2.5 - 1.2;
*(p++) = 6.6;
*p + 2 = 8.8; //错误

3.4.2 复合赋值操作符

  复合赋值操作符是由赋值操作符之前再加一个算术运算符构成。

名称运算符规则
加等于+=a += b 等价于 a = a+b
减等于-=a -= b 等价于 a = a-b
乘等于*=a *= b 等价于 a = a*b
除等于/=a /= b 等价于 a = a/b
模等于%=a %= b 等价于 a = a%b

  除了这些以外,还有 &=(按位与等于)、|= (按位或等于)、^= (按位异或等于)、以及 <<= 与 >>= 等。

3.5 单目操作符

符号作用
!逻辑反操作
负值
正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
减减(分为前置–和后置–)
++加加(分为前置++和后置++)
*解引用操作符(间接访问操作符)
(类型)强制类型转换

3.6 关系操作符

  关系操作符就比较简单了,如下:

>   大于
>=  大于等于
<   小于
<=  小于等于
==  相等
!=  不相等

注: == 是判断相等,切记不要与 = 赋值操作符混淆。

3.7 逻辑操作符

3.7.1 && (逻辑与)

  当两个操作数都为真时,结果为;当两个操作数有一个是假时,结果为

例如:
我们编写一段判断两个数是否都大于等于0的代码

int main()
{
	int a = 0;
	int b = 0;
	printf("输入两个数:\n");
	while(scanf("%d %d", &a, &b) != EOF)
	{
		if (a >= 0 && b >= 0)
		{
			printf("都大于等于0\n\n");
		}
		else
		{
			printf("至少一个小于0\n\n");
		}
	}
	
	return 0;
}

在这里插入图片描述

3.7.2 || (逻辑或)

  当两个操作数有一个为真时,结果为;当两个操作数都是假时,结果为

例如:
例如:我们编写一段判断两个数是否都小于0的代码

int main()
{
	int a = 0;
	int b = 0;
	printf("输入两个数:\n");
	while(scanf("%d %d", &a, &b) != EOF)
	{
		if (a >= 0 || b >= 0)
		{
			printf("至少有一个大于等于0\n\n");
		}
		else
		{
			printf("两个都小于0\n\n");
		}
	}
	
	return 0;
}

在这里插入图片描述

3.8 条件操作符

  条件表达式又称三目操作符,并且是C语言中唯一的三目操作符。

用法:
  表达式1 ? 表达式2 :表达式3 ;

详解如下

如果表达式1成立,则执行表达式2,表达式2的结果就是整个表达式的结果;如果表达式1不成立,执行表达式3,表达式3的结果为整个表达式的结果!

int main()
{
	int a = 0;
	int b = 0;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		a > b ? printf("%d更大\n\n", a) : printf("%d更大\n\n", b);
	}
	return 0;
}
if (a > b)
{
	printf("%d更大\n\n", a);
}
else
{
	printf("%d更大\n\n", b);
}

这两段代码的效果是一致的:

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

3.9 逗号表达式

  逗号表达式的作用就是分割多个表达式。

用法:
  表达式1 ,表达式2,表达式3 ,……,表达式n;

详解如下

先计算表达式1,然后计算表达式2,再计算表达式3,表最后计算表达式 n ,最后一个表达式的结果为整个表达式的结果。

例如:

int main()
{
	int a = 3;
	int b = 5;
	int c = (a = b + 5, b = a + 2, a, a+=3);
	//         a=10   , b=12,    ,10, a=13
	printf("%d %d %d\n", a, b, c);
	return 0;
}

在这里插入图片描述

3.10 特殊操作符

下标引用、函数调用和结构体成员操作符

3.10.1 [ ] 下标引用

  下标引用操作符 [ ] 用于访问数组中的元素。
效果如下:

int main()
{
	int arr[10] = { 3,1,5,2,9,4,7,8,6,10 };
	//              0,1,2,3,4,5,6,7,8,9
	printf("%d\n", arr[3]);//2
	printf("%d\n", arr[6]);//7
	printf("%d\n", arr[8]);//6

	return 0;
}

在这里插入图片描述

3.10.2 ( ) 函数调用

  函数调用操作符 ( ) 用于执行函数并传递参数。

这里我们可以写一个判断两个数中哪一个最大,顺便用三目操作符实现:

int max(int a, int b)
{
	return (a > b) ? a : b;
}
int main()
{
	int a = 0;
	int b = 0;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		printf("max = %d\n", max(a, b));
	}
	return 0;
}

在这里插入图片描述

3.10.3 ->和 . 结构体成员操作符

  结构体成员操作符用于访问结构体变量的成员。有两种操作符, . 用于直接访问结构体变量中的成员,而 -> 用于通过指向结构体的指针来访问其成员。

struct Stu
{
	char name[10];
	int age;
	char sex[5];
};
 
int main()
{
	struct Stu stu;
	struct Stu* pStu = &stu;
 
	stu.age = 10;
	printf("%d\n", stu.age);
	pStu->age = 20;
	printf("%d\n", pStu->age);
	return 0;
}

在这里插入图片描述

四、操作符的优先级

算术运算 > 关系运算 > 逻辑运算
在这里插入图片描述



完结

好啦,阅读到这里就已经看完了本期博客的全部内容了
在这里插入图片描述

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲键盘的小明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值