算术运算符
| 运算符 |
描述 |
示例 |
结果 |
+ |
加法 |
5 + 3 |
8 |
- |
减法 |
5 - 3 |
2 |
* |
乘法 |
5 * 3 |
15 |
/ |
除法 |
5 / 2 |
2 |
% |
取模 |
5 % 2 |
1 |
++ |
自增 |
a++ |
a+1 |
-- |
自减 |
a-- |
a-1 |
注意:
C语言中前缀与后缀自增自减运算符的区别
前缀形式(先增减)
++variable:先自增,后使用
--variable:先自减,后使用
后缀形式(后增减)
variable++:先使用,后自增
variable--:先使用,后自减
区别对比表
| 特性 |
前缀形式 (++a, --a) |
后缀形式 (a++, a--) |
| 执行顺序 |
先增减,后使用 |
先使用,后增减 |
| 返回值 |
返回增减后的值 |
返回增减前的值 |
| 性能 |
通常更高效 |
可能稍低(需要临时变量) |
| 常见用途 |
需要立即使用新值 |
需要先使用原值 |
代码示例
#include <stdio.h>
int main() {
int a = 5, b = 5;
int x, y;
// 前缀:先自增,后赋值
x = ++a;
printf("前缀: a = %d, x = %d\n", a, x); // a=6, x=6
// 后缀:先赋值,后自增
y = b++;
printf("后缀: b = %d, y = %d\n", b, y); // b=6, y=5
return 0;
}
关系运算符
| 运算符 |
描述 |
示例 |
结果 |
== |
等于 |
5 == 3 |
0 |
!= |
不等于 |
5 != 3 |
1 |
> |
大于 |
5 > 3 |
1 |
< |
小于 |
5 < 3 |
0 |
>= |
大于等于 |
5 >= 3 |
1 |
<= |
小于等于 |
5 <= 3 |
0 |
逻辑运算符
| 运算符 |
描述 |
示例 |
结果 |
&& |
逻辑与(全真为真,有假为假,若第一个为假则第二个不判断(短路) |
(5>3) && (2>1) |
1 |
|| |
逻辑或(全假为假,有真为真,若第一个为真则第二个不判断(短路)) |
(5>3) || (2<1) |
1 |
! |
逻辑非 |
!(5>3) |
0 |
位运算符(以二进制形式进行位操作)
| 运算符 |
描述 |
示例 |
结果 |
& |
按位与 |
5 & 3 |
1 |
| |
按位或 |
5 | 3 |
7 |
^ |
按位异或 |
5 ^ 3 |
6 |
~ |
按位取反 |
~5 |
-6 |
<< |
左移(移出丢弃,空出补0) |
5 << 1 |
10 |
>> |
右移(移出丢弃,空出补符号位) |
5 >> 1 |
2 |
赋值运算符
| 运算符 |
描述 |
等价于 |
= |
简单赋值 |
a = 5 |
+= |
加后赋值 |
a += 5 → a = a + 5 |
-= |
减后赋值 |
a -= 5 → a = a - 5 |
*= |
乘后赋值 |
a *= 5 → a = a * 5 |
/= |
除后赋值 |
a /= 5 → a = a / 5 |
%= |
取模后赋值 |
a %= 5 → a = a % 5 |
&= |
按位与后赋值 |
a &= 5 → a = a & 5 |
|= |
按位或后赋值 |
a |= 5 → a = a | 5 |
^= |
按位异或后赋值 |
a ^= 5 → a = a ^ 5 |
<<= |
左移后赋值 |
a <<= 5 → a = a << 5 |
>>= |
右移后赋值 |
a >>= 5 → a = a >> 5 |
其他运算符
| 运算符 |
描述 |
示例 |
sizeof() |
返回变量或类型的大小 |
sizeof(int) |
& |
取地址运算符 |
&a |
* |
指针运算符 |
*ptr |
?: |
条件运算符 |
a > b ? a : b |
, |
逗号运算符 |
a = (b=3, b+2) → a=5 |
[] |
下标运算符 |
arr[5] |
-> |
结构体指针成员访问 |
ptr->member |
. |
结构体成员访问 |
struct.member |
运算符优先级
从高到低排列:
| 运算符 |
结合性 |
说明 |
() [] -> . ++ -- |
左到右 |
[1] 后缀操作 |
! ~ ++ -- + - (type) * & sizeof |
右到左 |
[2] 一元操作 |
* / % |
左到右 |
乘除运算 |
+ - |
左到右 |
加减运算 |
<< >> |
左到右 |
位移运算 |
< <= > >= |
左到右 |
关系比较 |
== != |
左到右 |
相等比较 |
& |
左到右 |
按位与 |
^ |
左到右 |
按位异或 |
| |
左到右 |
按位或 |
&& |
左到右 |
逻辑与 |
|| |
左到右 |
逻辑或 |
?: |
右到左 |
条件运算符 |
= += -= *= /= %= <<= >>= &= ^= |= |
右到左 |
赋值运算符 |
, |
左到右 |
逗号运算符 |
代码示例
#include <stdio.h>
#include <stdio.h>
int main() {
// 算术运算符
int a = 10, b = 3;
printf("算术运算:\n");
printf("%d + %d = %d\n", a, b, a + b); // 10 + 3 = 13
printf("%d / %d = %d\n", a, b, a / b); // 10 / 3 = 3(整数除法,小数部分被截断)
// 关系运算符
printf("\n关系运算:\n");
printf("%d > %d = %d\n", a, b, a > b); // 10 > 3 = 1(真)
// 逻辑运算符
printf("\n逻辑运算:\n");
printf("(%d>%d) && (%d<%d) = %d\n", a, b, a, b, (a>b) && (a<b));
// (10>3) && (10<3) = 0(真 && 假 = 假)
// 位运算
printf("\n位运算:\n");
printf("%d & %d = %d\n", a, b, a & b); // 10 & 3 = 2
// 10的二进制: 1010, 3的二进制: 0011
// 按位与结果: 0010 = 2
// 赋值运算
int c = a; // c = 10
c += 5; // c = 10 + 5 = 15
printf("\n赋值运算: c = %d\n", c); // 输出: c = 15
// 条件运算符
int max = (a > b) ? a : b; // 10 > 3 为真,所以 max = a = 10
printf("最大值: %d\n", max); // 输出: 最大值: 10
return 0;
}