㊙️小明博客主页:➡️ 敲键盘的小明 ㊙️
✅关注小明了解更多知识☝️
前言
提示:本篇文章为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 m∗2n。
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;
}

四、操作符的优先级
算术运算 > 关系运算 > 逻辑运算

完结
好啦,阅读到这里就已经看完了本期博客的全部内容了
