🌟 各位看官好,我是 maomi_9526!
🌍 种一棵树最好是十年前,其次是现在!
🚀 今天来学习C语言的相关知识。
👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦
目录
[1. 操作符的分类](#1. 操作符的分类)
[2. 操作符的优先级和结合性](#2. 操作符的优先级和结合性)
[3. 左移操作符(<<)](#3. 左移操作符(<<))
[4. 按位与操作符(&)](#4. 按位与操作符(&))
[5. 按位异或操作符(^)](#5. 按位异或操作符(^))
[6. 使用按位异或交换两个变量的值](#6. 使用按位异或交换两个变量的值)
[7. 整型提升与算术转换](#7. 整型提升与算术转换)
1. 操作符的分类
我们首先将操作符分类,并通过表格详细说明每种类型的操作符。操作符在C语言中非常重要,它们帮助我们完成各种计算任务,包括数学计算、逻辑判断、位运算等。
类别 | 操作符 | 说明 |
---|---|---|
算术操作符 | + , - , * , / , % |
用于执行常见的数学运算,如加法、减法、乘法、除法和取余。 |
移位操作符 | << , >> |
用于将二进制位进行左移或右移。右移时有逻辑右移和算术右移的区别。 |
位操作符 | & , ` |
, ^, ~` |
赋值操作符 | = , += , -= , *= , /= , %= 等 |
用于给变量赋值,支持复合赋值操作(如+=,-=等)。 |
单目操作符 | ! , ++ , -- , & , * , + , - , ~ , sizeof , (type) |
只有一个操作数。用于逻辑非、自增、自减、地址获取、类型转换等。 |
关系操作符 | > , >= , < , <= , == , != |
用于比较两个值的大小或是否相等。 |
逻辑操作符 | && , ` |
|
条件操作符 | ?: |
三目运算符,用于简化条件判断的表达式。 |
逗号操作符 | , |
逗号分隔多个子表达式,按顺序执行每个表达式,并返回最后一个表达式的值。 |
下标访问 | [] |
用于访问数组元素。 |
函数调用 | () |
用于调用函数,并传递参数。 |
结构成员访问 | . , -> |
用于访问结构体的成员。 |
2. 操作符的优先级和结合性
优先级:
优先级决定了在同一个表达式中,多个运算符的执行顺序。例如,在表达式中同时出现+
和*
时,乘法(*
)的优先级高于加法(+
),因此*
会先执行。
结合性:
结合性决定了同一优先级的运算符的执行顺序。大部分运算符是左结合 的(即从左到右执行),少数是右结合 的(如赋值操作符=
)。对于右结合的运算符,操作数会从右向左进行运算。
操作符类型 | 结合性 |
---|---|
左结合操作符 | 大多数运算符,如 + , - , * , && , ` |
右结合操作符 | = , ?: |
操作符优先级示例:
#include <stdio.h>
int main() {
int a = 3;
int b = 4;
int c = 5;
int result = a + b * c; // 乘法优先级高于加法
printf("result = %d\n", result); // 输出: result = 23 (4 * 5 = 20, 3 + 20 = 23)
return 0;
}
解释:
- 在
a + b * c
中,乘法操作b * c
的优先级高于加法操作a + b
,因此先计算b * c = 20
,然后再进行加法运算3 + 20 = 23
。
3. 左移操作符(<<)
左移操作符将二进制数向左移动,右侧填充0。左移操作通常会导致数值乘以2的倍数(每左移一位,数值乘以2)。
#include <stdio.h>
int main() {
int num = 10; // 二进制:1010
int n = num << 1; // 左移1位
printf("n = %d\n", n); // 输出: n = 20 (二进制:10100)
printf("num = %d\n", num); // 输出: num = 10
return 0;
}
解释:
num
的二进制表示是1010
(即10)。当执行num << 1
时,num
的所有位向左移动一位,右侧补充0,变成10100
(即20)。- 左移1位等于将原值乘以2,因此
10 << 1
的结果是20
。
4. 按位与操作符(&)
按位与操作符&
逐位比较两个整数的对应位,只有当两位都为1
时,结果才为1
,否则为0
。
#include <stdio.h>
int main() {
int num1 = -3; // 二进制:11111111111111111111111111111101(补码)
int num2 = 5; // 二进制:00000000000000000000000000000101
printf("%d\n", num1 & num2); // 输出:5
return 0;
}
解释:
-3
的二进制补码为11111111111111111111111111111101
,5
的二进制为00000000000000000000000000000101
。- 按位与操作符会逐位比较这两个二进制数,当两个位都为
1
时,结果为1
。因此,只有第三和第四位是1
,结果为5
。
5. 按位异或操作符(^)
按位异或操作符^
逐位比较两个数的对应位,只有当两个位不相同时,结果才为1
。
#include <stdio.h>
int main() {
int num1 = 6; // 二进制:00000000000000000000000000000110
int num2 = 5; // 二进制:00000000000000000000000000000101
printf("%d\n", num1 ^ num2); // 输出:3 (二进制:00000000000000000000000000000011)
return 0;
}
解释:
6
的二进制表示为00000000000000000000000000000110
,5
的二进制为00000000000000000000000000000101
。- 按位异或操作符会逐位比较这两个数的二进制表示,当对应位不相同时,结果为
1
。因此,结果是3
。
6. 使用按位异或交换两个变量的值
这种技巧常用于不使用临时变量交换两个数的值。
#include <stdio.h>
int main() {
int a = 10, b = 20;
a = a ^ b; // a = 10 ^ 20
b = a ^ b; // b = (10 ^ 20) ^ 20
a = a ^ b; // a = (10 ^ 20) ^ 10
printf("a = %d, b = %d\n", a, b); // 输出: a = 20, b = 10
return 0;
}
解释:
- 使用
^
(异或操作符),通过一系列的异或操作,我们可以交换两个数的值。第一步是a = a ^ b
,接着通过再次异或将原本的a
和b
值互换。 - 这个技巧避免了使用临时变量。
7. 整型提升与算术转换
C语言中的整型提升是指小类型(如char
、short
)会在进行算术运算时被自动转换为int
类型。
整型提升示例
#include <stdio.h>
int main() {
char a = 5;
short b = 10;
int result = a + b; // a 和 b 会提升为 int 类型进行加法
printf("result = %d\n", result); // 输出: result = 15
return 0;
}
解释:
- 在
a + b
中,a
是char
类型,b
是short
类型。它们都被自动提升为int
类型,因此加法操作是在int
类型下进行的。
算术转换
当表达式中的操作数类型不同,C语言会根据某些规则进行类型转换。
#include <stdio.h>
int main() {
float a = 3.14;
int b = 2;
float result = a + b; // b 会被转换为 float 类型
printf("result = %.2f\n", result); // 输出: result = 5.14
return 0;
}
解释:
- 在
a + b
中,a
是float
类型,b
是int
类型。b
会被自动转换为float
类型,这样加法操作就会在float
类型下进行。