C语言操作符详解
-
- [1. 算术操作符](#1. 算术操作符)
- [2. 关系操作符](#2. 关系操作符)
- [3. 逻辑操作符](#3. 逻辑操作符)
- [4. 位操作符](#4. 位操作符)
- [5. 赋值操作符](#5. 赋值操作符)
- [6. 递增递减操作符](#6. 递增递减操作符)
- [7. 条件操作符](#7. 条件操作符)
- [8. 逗号操作符](#8. 逗号操作符)
- [9. 指针操作符](#9. 指针操作符)
- [10. 结构体/联合体操作符](#10. 结构体/联合体操作符)
- [11. 特殊操作符](#11. 特殊操作符)
- [12. 类型转换操作符](#12. 类型转换操作符)
- 操作符优先级总表(从高到低)
1. 算术操作符
| 操作符 |
名称 |
说明 |
示例 |
+ |
加法 |
两个操作数相加 |
a + b |
- |
减法 |
两个操作数相减 |
a - b |
* |
乘法 |
两个操作数相乘 |
a * b |
/ |
除法 |
两个操作数相除 |
a / b |
% |
取模 |
返回除法的余数 |
a % b |
示例代码:
#include <stdio.h>
int main() {
int a = 10, b = 3;
float x = 10.0, y = 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("x / y = %.2f\n", x / y); // 浮点数除法:3.33
printf("a %% b = %d\n", a % b); // 取模:1
return 0;
}
2. 关系操作符
| 操作符 |
名称 |
说明 |
示例 |
== |
等于 |
检查两个操作数是否相等 |
a == b |
!= |
不等于 |
检查两个操作数是否不相等 |
a != b |
> |
大于 |
检查左操作数是否大于右操作数 |
a > b |
< |
小于 |
检查左操作数是否小于右操作数 |
a < b |
>= |
大于等于 |
检查左操作数是否大于或等于右操作数 |
a >= b |
<= |
小于等于 |
检查左操作数是否小于或等于右操作数 |
a <= b |
示例代码:
#include <stdio.h>
int main() {
int a = 10, b = 20;
printf("a == b: %d\n", a == b); // 等于:0(false)
printf("a != b: %d\n", a != b); // 不等于:1(true)
printf("a > b: %d\n", a > b); // 大于:0
printf("a < b: %d\n", a < b); // 小于:1
printf("a >= b: %d\n", a >= b); // 大于等于:0
printf("a <= b: %d\n", a <= b); // 小于等于:1
return 0;
}
3. 逻辑操作符
| 操作符 |
名称 |
说明 |
示例 |
&& |
逻辑与 |
两个条件都为真时结果为真 |
a && b |
| ` |
|
` |
逻辑或 |
! |
逻辑非 |
反转操作数的逻辑状态 |
!a |
示例代码:
#include <stdio.h>
int main() {
int a = 1, b = 0, c = 1;
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 = 0, y = 0;
if (x != 0 && y++ != 0) {
// 由于x!=0为false,y++不会执行
}
printf("y = %d\n", y); // 输出:0
return 0;
}
4. 位操作符
| 操作符 |
名称 |
说明 |
示例 |
& |
按位与 |
对两个操作数的每一位执行与操作 |
a & b |
| ` |
` |
按位或 |
对两个操作数的每一位执行或操作 |
^ |
按位异或 |
对两个操作数的每一位执行异或操作 |
a ^ b |
~ |
按位取反 |
对操作数的每一位执行取反操作 |
~a |
<< |
左移 |
将位向左移动指定次数 |
a << n |
>> |
右移 |
将位向右移动指定次数 |
a >> n |
示例代码:
#include <stdio.h>
int main() {
unsigned int a = 5; // 二进制:0101
unsigned int b = 3; // 二进制:0011
printf("a & b = %u\n", a & b); // 按位与:0001 = 1
printf("a | b = %u\n", a | b); // 按位或:0111 = 7
printf("a ^ b = %u\n", a ^ b); // 按位异或:0110 = 6
printf("~a = %u\n", ~a); // 按位取反:...11111010
printf("a << 1 = %u\n", a << 1); // 左移1位:1010 = 10
printf("a >> 1 = %u\n", a >> 1); // 右移1位:0010 = 2
return 0;
}
5. 赋值操作符
| 操作符 |
名称 |
说明 |
示例 |
= |
赋值 |
将右操作数的值赋给左操作数 |
a = b |
+= |
加后赋值 |
左操作数加右操作数后赋给左操作数 |
a += b |
-= |
减后赋值 |
左操作数减右操作数后赋给左操作数 |
a -= b |
*= |
乘后赋值 |
左操作数乘右操作数后赋给左操作数 |
a *= b |
/= |
除后赋值 |
左操作数除右操作数后赋给左操作数 |
a /= b |
%= |
取模后赋值 |
左操作数取模右操作数后赋给左操作数 |
a %= b |
&= |
按位与后赋值 |
按位与操作后赋值 |
a &= b |
| ` |
=` |
按位或后赋值 |
按位或操作后赋值 |
^= |
按位异或后赋值 |
按位异或操作后赋值 |
a ^= b |
<<= |
左移后赋值 |
左移操作后赋值 |
a <<= n |
>>= |
右移后赋值 |
右移操作后赋值 |
a >>= n |
示例代码:
#include <stdio.h>
int main() {
int a = 10;
// 简单赋值
a = 20;
printf("a = %d\n", a);
// 复合赋值
a += 5; // 等价于 a = a + 5
printf("a += 5: %d\n", a);
a -= 3; // 等价于 a = a - 3
printf("a -= 3: %d\n", a);
a *= 2; // 等价于 a = a * 2
printf("a *= 2: %d\n", a);
a /= 4; // 等价于 a = a / 4
printf("a /= 4: %d\n", a);
a %= 3; // 等价于 a = a % 3
printf("a %%= 3: %d\n", a);
// 位运算复合赋值
unsigned int b = 5;
b &= 3; // b = b & 3
b |= 8; // b = b | 8
b ^= 4; // b = b ^ 4
return 0;
}
6. 递增递减操作符
| 操作符 |
名称 |
说明 |
示例 |
++ |
递增 |
操作数的值增加1 |
a++ 或 ++a |
-- |
递减 |
操作数的值减少1 |
a-- 或 --a |
示例代码:
#include <stdio.h>
int main() {
int a = 5;
// 后置递增
printf("a++: %d\n", a++); // 先使用a的值5,然后a变为6
printf("a: %d\n", a); // 输出:6
// 前置递增
printf("++a: %d\n", ++a); // 先递增a为7,然后使用
printf("a: %d\n", a); // 输出:7
// 后置递减
printf("a--: %d\n", a--); // 先使用a的值7,然后a变为6
printf("a: %d\n", a); // 输出:6
// 前置递减
printf("--a: %d\n", --a); // 先递减a为5,然后使用
printf("a: %d\n", a); // 输出:5
return 0;
}
7. 条件操作符
| 操作符 |
名称 |
说明 |
示例 |
? : |
条件操作符 |
根据条件选择两个表达式之一 |
a > b ? a : b |
示例代码:
#include <stdio.h>
int main() {
int a = 10, b = 20;
// 条件 ? 表达式1 : 表达式2
int max = (a > b) ? a : b;
printf("较大的数是: %d\n", max);
// 嵌套条件操作符
int score = 85;
char grade = (score >= 90) ? 'A' :
(score >= 80) ? 'B' :
(score >= 70) ? 'C' : 'D';
printf("成绩等级: %c\n", grade);
return 0;
}
8. 逗号操作符
| 操作符 |
名称 |
说明 |
示例 |
, |
逗号 |
按顺序执行多个表达式,返回最后一个表达式的值 |
a = (b++, c++) |
示例代码:
#include <stdio.h>
int main() {
int a, b, c;
// 逗号操作符按顺序求值,返回最后一个表达式的值
c = (a = 5, b = 10, a + b);
printf("a = %d, b = %d, c = %d\n", a, b, c); // 输出:a=5, b=10, c=15
// 在for循环中的常见用法
for (int i = 0, j = 10; i < j; i++, j--) {
printf("i = %d, j = %d\n", i, j);
}
return 0;
}
9. 指针操作符
| 操作符 |
名称 |
说明 |
示例 |
& |
取地址 |
返回变量的内存地址 |
&a |
* |
解引用 |
返回指针指向地址的值 |
*ptr |
-> |
箭头 |
通过指针访问结构体成员 |
ptr->member |
#include <stdio.h>
int main() {
int var = 100;
int *ptr = &var;
// 取地址操作符 &
printf("变量var的地址: %p\n", &var);
printf("指针ptr的值: %p\n", ptr);
// 解引用操作符 *
printf("var的值: %d\n", var);
printf("*ptr的值: %d\n", *ptr);
// 通过指针修改变量值
*ptr = 200;
printf("修改后var的值: %d\n", var);
return 0;
}
10. 结构体/联合体操作符
| 操作符 |
名称 |
说明 |
示例 |
. |
成员访问 |
访问结构体或联合体的成员 |
s.member |
-> |
箭头 |
通过指针访问结构体或联合体成员 |
ptr->member |
示例代码:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student s1 = {"张三", 20, 85.5};
struct Student *ptr = &s1;
// 成员操作符 .
printf("姓名: %s\n", s1.name);
printf("年龄: %d\n", s1.age);
printf("分数: %.1f\n", s1.score);
// 箭头操作符 ->
printf("指针访问 - 姓名: %s\n", ptr->name);
printf("指针访问 - 年龄: %d\n", ptr->age);
return 0;
}
11. 特殊操作符
| 操作符 |
名称 |
说明 |
示例 |
sizeof |
大小 |
返回数据类型或变量的大小(字节) |
sizeof(int) |
(type) |
强制类型转换 |
将值转换为指定类型 |
(float)a |
[] |
下标 |
访问数组元素 |
arr[i] |
示例代码:
#include <stdio.h>
int main() {
int a;
double b;
char c;
int arr[10];
printf("sizeof(int): %zu bytes\n", sizeof(int));
printf("sizeof(a): %zu bytes\n", sizeof(a));
printf("sizeof(double): %zu bytes\n", sizeof(double));
printf("sizeof(char): %zu bytes\n", sizeof(char));
printf("sizeof(arr): %zu bytes\n", sizeof(arr));
printf("数组元素个数: %zu\n", sizeof(arr) / sizeof(arr[0]));
return 0;
}
12. 类型转换操作符
#include <stdio.h>
int main() {
int a = 10, b = 3;
float result;
// 隐式类型转换
result = a / b; // 整数除法
printf("整数除法: %.2f\n", result); // 输出:3.00
// 显式类型转换(强制类型转换)
result = (float)a / b; // 浮点数除法
printf("浮点数除法: %.2f\n", result); // 输出:3.33
// 其他类型转换
double d = 3.14159;
int integer_part = (int)d;
printf("整数部分: %d\n", integer_part); // 输出:3
return 0;
}
操作符优先级总表(从高到低)
| 优先级 |
操作符 |
描述 |
结合性 |
| 1 |
() [] -> . ++ -- |
函数调用、数组下标、结构成员、后置递增递减 |
从左到右 |
| 2 |
! ~ ++ -- + - * & (type) sizeof |
逻辑非、按位取反、前置递增递减、正负号、指针、类型转换 |
从右到左 |
| 3 |
* / % |
乘法、除法、取模 |
从左到右 |
| 4 |
+ - |
加法、减法 |
从左到右 |
| 5 |
<< >> |
位左移、位右移 |
从左到右 |
| 6 |
< <= > >= |
关系操作符 |
从左到右 |
| 7 |
== != |
相等性操作符 |
从左到右 |
| 8 |
& |
按位与 |
从左到右 |
| 9 |
^ |
按位异或 |
从左到右 |
| 10 |
` |
` |
按位或 |
| 11 |
&& |
逻辑与 |
从左到右 |
| 12 |
` |
|
` |
| 13 |
? : |
条件操作符 |
从右到左 |
| 14 |
= += -= *= /= %= &= ^= ` |
= <<= >>=` |
赋值操作符 |
| 15 |
, |
逗号操作符 |
从左到右 |
示例代码:
#include <stdio.h>
int main() {
int a = 5, b = 3, c = 2;
int result;
// 操作符优先级示例
result = a + b * c; // 先乘后加:5 + 6 = 11
printf("a + b * c = %d\n", result);
result = (a + b) * c; // 先加后乘:8 * 2 = 16
printf("(a + b) * c = %d\n", result);
result = a++ * b + c; // 5*3 + 2 = 17,然后a变为6
printf("a++ * b + c = %d, a = %d\n", result, a);
return 0;
}