Appearance
运算符
运算符是C语言中用于执行各种操作的符号,它们可以对变量和常量进行运算。C语言提供了丰富的运算符,用于处理不同类型的操作。在本章节中,我们将学习C语言中的各种运算符及其使用方法。
1. 运算符的分类
C语言中的运算符可以分为以下几类:
- 算术运算符:用于进行数学运算
- 关系运算符:用于比较两个值
- 逻辑运算符:用于进行逻辑运算
- 位运算符:用于进行位级运算
- 赋值运算符:用于给变量赋值
- 增量和减量运算符:用于增加或减少变量的值
- 条件运算符:用于条件判断
- 逗号运算符:用于分隔表达式
- 指针运算符:用于指针操作
- ** sizeof运算符**:用于计算数据类型或变量的大小
2. 算术运算符
算术运算符用于执行基本的数学运算,如加法、减法、乘法、除法等。
2.1 基本算术运算符
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
+ | 加法 | a + b | a和b的和 |
- | 减法 | a - b | a和b的差 |
* | 乘法 | a * b | a和b的积 |
/ | 除法 | a / b | a除以b的商 |
% | 取模(余数) | a % b | a除以b的余数 |
2.2 注意事项
- 除法运算符:当两个操作数都是整数时,执行整数除法,结果会截断小数部分
- 取模运算符:操作数必须是整数,结果的符号与被除数相同
2.3 示例
c
#include <stdio.h>
int main() {
int a = 10, b = 3;
float c = 10.0, d = 3.0;
printf("a + b = %d\n", a + b); // 13
printf("a - b = %d\n", a - b); // 7
printf("a * b = %d\n", a * b); // 30
printf("a / b = %d\n", a / b); // 3(整数除法)
printf("a %% b = %d\n", a % b); // 1(取模)
printf("c / d = %.2f\n", c / d); // 3.33(浮点除法)
return 0;
}3. 关系运算符
关系运算符用于比较两个值,返回布尔值(真或假)。在C语言中,真用1表示,假用0表示。
3.1 关系运算符列表
| 运算符 | 描述 | 示例 | 结果(如果a=5, b=3) |
|---|---|---|---|
== | 等于 | a == b | 0(假) |
!= | 不等于 | a != b | 1(真) |
> | 大于 | a > b | 1(真) |
< | 小于 | a < b | 0(假) |
>= | 大于等于 | a >= b | 1(真) |
<= | 小于等于 | a <= b | 0(假) |
3.2 示例
c
#include <stdio.h>
int main() {
int a = 5, b = 3;
printf("a == b: %d\n", a == b); // 0
printf("a != b: %d\n", a != b); // 1
printf("a > b: %d\n", a > b); // 1
printf("a < b: %d\n", a < b); // 0
printf("a >= b: %d\n", a >= b); // 1
printf("a <= b: %d\n", a <= b); // 0
return 0;
}4. 逻辑运算符
逻辑运算符用于组合多个条件,返回布尔值(真或假)。
4.1 逻辑运算符列表
| 运算符 | 描述 | 示例 | 结果(如果a=1, b=0) |
|---|---|---|---|
&& | 逻辑与 | a && b | 0(假) |
| ` | ` | 逻辑或 | |
! | 逻辑非 | !a | 0(假) |
4.2 短路求值
C语言中的逻辑运算符支持短路求值:
&&:如果第一个操作数为假,则不会计算第二个操作数||:如果第一个操作数为真,则不会计算第二个操作数
4.3 示例
c
#include <stdio.h>
int main() {
int a = 1, b = 0;
printf("a && b: %d\n", a && b); // 0
printf("a || b: %d\n", a || b); // 1
printf("!a: %d\n", !a); // 0
printf("!b: %d\n", !b); // 1
// 短路求值示例
int x = 5, y = 10;
printf("(x > 10) && (y++ > 5): %d\n", (x > 10) && (y++ > 5)); // 0,y++不会执行
printf("y = %d\n", y); // 10
printf("(x < 10) || (y++ > 5): %d\n", (x < 10) || (y++ > 5)); // 1,y++不会执行
printf("y = %d\n", y); // 10
return 0;
}5. 位运算符
位运算符用于对二进制位进行操作,直接操作内存中的位。
5.1 位运算符列表
| 运算符 | 描述 | 示例(二进制) | 结果(二进制) |
|---|---|---|---|
& | 按位与 | 1010 & 1100 | 1000 |
| ` | ` | 按位或 | `1010 |
^ | 按位异或 | 1010 ^ 1100 | 0110 |
~ | 按位取反 | ~1010 | 0101(假设4位) |
<< | 左移 | 1010 << 1 | 10100 |
>> | 右移 | 1010 >> 1 | 0101 |
5.2 示例
c
#include <stdio.h>
int main() {
int a = 10; // 二进制:1010
int b = 12; // 二进制:1100
printf("a & b = %d\n", a & b); // 8(二进制:1000)
printf("a | b = %d\n", a | b); // 14(二进制:1110)
printf("a ^ b = %d\n", a ^ b); // 6(二进制:0110)
printf("~a = %d\n", ~a); // -11(按位取反)
printf("a << 1 = %d\n", a << 1); // 20(二进制:10100)
printf("a >> 1 = %d\n", a >> 1); // 5(二进制:0101)
return 0;
}6. 赋值运算符
赋值运算符用于给变量赋值,可以与其他运算符组合使用。
6.1 赋值运算符列表
| 运算符 | 描述 | 示例 | 等价于 |
|---|---|---|---|
= | 简单赋值 | a = b | a = b |
+= | 加后赋值 | 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 |
&= | 按位与后赋值 | a &= b | a = a & b |
| ` | =` | 按位或后赋值 | `a |
^= | 按位异或后赋值 | a ^= b | a = a ^ b |
<<= | 左移后赋值 | a <<= b | a = a << b |
>>= | 右移后赋值 | a >>= b | a = a >> b |
6.2 示例
c
#include <stdio.h>
int main() {
int a = 10;
printf("初始值 a = %d\n", a);
a += 5; // a = a + 5
printf("a += 5: %d\n", a); // 15
a -= 3; // a = a - 3
printf("a -= 3: %d\n", a); // 12
a *= 2; // a = a * 2
printf("a *= 2: %d\n", a); // 24
a /= 4; // a = a / 4
printf("a /= 4: %d\n", a); // 6
a %= 3; // a = a % 3
printf("a %%= 3: %d\n", a); // 0
return 0;
}7. 增量和减量运算符
增量和减量运算符用于增加或减少变量的值,分为前缀和后缀两种形式。
7.1 增量和减量运算符列表
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
++a | 前缀增量 | a=5; b=++a; | a=6, b=6 |
a++ | 后缀增量 | a=5; b=a++; | a=6, b=5 |
--a | 前缀减量 | a=5; b=--a; | a=4, b=4 |
a-- | 后缀减量 | a=5; b=a--; | a=4, b=5 |
7.2 区别
- 前缀形式:先修改变量的值,再使用修改后的值
- 后缀形式:先使用变量的当前值,再修改变量的值
7.3 示例
c
#include <stdio.h>
int main() {
int a = 5, b;
// 前缀增量
b = ++a;
printf("前缀增量: a=%d, b=%d\n", a, b); // a=6, b=6
// 重置a
a = 5;
// 后缀增量
b = a++;
printf("后缀增量: a=%d, b=%d\n", a, b); // a=6, b=5
// 重置a
a = 5;
// 前缀减量
b = --a;
printf("前缀减量: a=%d, b=%d\n", a, b); // a=4, b=4
// 重置a
a = 5;
// 后缀减量
b = a--;
printf("后缀减量: a=%d, b=%d\n", a, b); // a=4, b=5
return 0;
}8. 条件运算符
条件运算符(三元运算符)是C语言中唯一的三元运算符,用于简洁地表达条件判断。
8.1 语法
c
条件 ? 表达式1 : 表达式28.2 说明
- 如果条件为真,执行表达式1并返回其结果
- 如果条件为假,执行表达式2并返回其结果
8.3 示例
c
#include <stdio.h>
int main() {
int a = 10, b = 20;
int max;
// 使用条件运算符找出最大值
max = (a > b) ? a : b;
printf("最大值: %d\n", max); // 20
// 使用条件运算符判断奇偶性
int num = 7;
printf("%d是%s\n", num, (num % 2 == 0) ? "偶数" : "奇数"); // 奇数
return 0;
}9. 逗号运算符
逗号运算符用于分隔多个表达式,从左到右依次执行,返回最后一个表达式的结果。
9.1 语法
c
表达式1, 表达式2, 表达式3, ..., 表达式n9.2 示例
c
#include <stdio.h>
int main() {
int a, b, c;
// 使用逗号运算符
a = 10, b = 20, c = a + b;
printf("a=%d, b=%d, c=%d\n", a, b, c); // 10, 20, 30
// 在for循环中使用逗号运算符
for (int i = 0, j = 10; i < 5; i++, j--) {
printf("i=%d, j=%d\n", i, j);
}
return 0;
}10. 指针运算符
指针运算符用于处理指针,包括取地址运算符和间接寻址运算符。
10.1 指针运算符列表
| 运算符 | 描述 | 示例 |
|---|---|---|
& | 取地址运算符 | &a 获取变量a的地址 |
* | 间接寻址运算符 | *p 获取指针p指向的值 |
10.2 示例
c
#include <stdio.h>
int main() {
int a = 10;
int *p; // 声明指针变量
p = &a; // 将a的地址赋给p
printf("a的值: %d\n", a); // 10
printf("a的地址: %p\n", &a); // a的内存地址
printf("p的值: %p\n", p); // a的内存地址
printf("*p的值: %d\n", *p); // 10(通过指针访问a的值)
*p = 20; // 通过指针修改a的值
printf("修改后a的值: %d\n", a); // 20
return 0;
}11. sizeof运算符
sizeof运算符用于计算数据类型或变量占用的字节数。
11.1 语法
c
sizeof(数据类型)
sizeof(变量名)
sizeof 变量名11.2 示例
c
#include <stdio.h>
int main() {
printf("int的大小: %zu字节\n", sizeof(int));
printf("float的大小: %zu字节\n", sizeof(float));
printf("double的大小: %zu字节\n", sizeof(double));
printf("char的大小: %zu字节\n", sizeof(char));
int a;
printf("变量a的大小: %zu字节\n", sizeof(a));
int arr[10];
printf("数组arr的大小: %zu字节\n", sizeof(arr));
printf("数组元素个数: %zu\n", sizeof(arr) / sizeof(arr[0]));
return 0;
}12. 运算符的优先级
运算符的优先级决定了表达式中操作的执行顺序。优先级高的运算符先执行,优先级低的运算符后执行。
12.1 优先级从高到低
- 括号:
() - 一元运算符:
++,--,!,~,+,-,*,& - 算术运算符:
*,/,%高于+,- - 位移运算符:
<<,>> - 关系运算符:
>,<,>=,<=高于==,!= - 位运算符:
&高于^高于| - 逻辑运算符:
&&高于|| - 条件运算符:
?: - 赋值运算符:
=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>= - 逗号运算符:
,
12.2 注意事项
当表达式中包含多个运算符时,建议使用括号明确指定运算顺序,提高代码可读性。
12.3 示例
c
#include <stdio.h>
int main() {
int a = 5, b = 3, c = 2;
int result;
// 优先级示例
result = a + b * c; // 先乘后加,结果为11
printf("a + b * c = %d\n", result);
result = (a + b) * c; // 先加后乘,结果为16
printf("(a + b) * c = %d\n", result);
result = a > b && b < c; // 先比较,后逻辑与,结果为0
printf("a > b && b < c = %d\n", result);
return 0;
}13. 示例:综合运用
让我们看一个综合运用各种运算符的例子:
c
#include <stdio.h>
int main() {
int a = 10, b = 5, c = 3;
// 算术运算符
printf("a + b = %d\n", a + b); // 15
printf("a - b = %d\n", a - b); // 5
printf("a * b = %d\n", a * b); // 50
printf("a / b = %d\n", a / b); // 2
printf("a %% c = %d\n", a % c); // 1
// 关系运算符
printf("a > b: %d\n", a > b); // 1
printf("a == b: %d\n", a == b); // 0
// 逻辑运算符
printf("(a > b) && (b > c): %d\n", (a > b) && (b > c)); // 1
printf("(a < b) || (b > c): %d\n", (a < b) || (b > c)); // 1
// 赋值运算符
a += b; // a = a + b = 15
printf("a += b: %d\n", a); // 15
// 增量运算符
b++; // b = 6
printf("b++: %d\n", b); // 6
// 条件运算符
int max = (a > b) ? a : b;
printf("最大值: %d\n", max); // 15
// sizeof运算符
printf("int的大小: %zu字节\n", sizeof(int)); // 4
return 0;
}小结
C语言提供了丰富的运算符,用于执行各种操作:
- 算术运算符:用于基本数学运算
- 关系运算符:用于比较值
- 逻辑运算符:用于组合条件
- 位运算符:用于位级操作
- 赋值运算符:用于给变量赋值
- 增量和减量运算符:用于修改变量值
- 条件运算符:用于简洁的条件判断
- 逗号运算符:用于分隔表达式
- 指针运算符:用于处理指针
- sizeof运算符:用于计算大小
了解运算符的功能、优先级和使用方法,对于编写正确、高效的C程序非常重要。在实际编程中,应根据具体需求选择合适的运算符,并注意运算符的优先级和结合性。