算术运算符
运算符 |
描述 |
示例 |
结果 |
+ |
加法 |
5 + 3 |
8 |
- |
减法 |
5 - 3 |
2 |
* |
乘法 |
5 * 3 |
15 |
/ |
除法 |
5 / 2 |
2 |
% |
取模 |
5 % 2 |
1 |
++ |
自增 |
a++ |
a+1 |
-- |
自减 |
a-- |
a-1 |
注意:
关系运算符
运算符 |
描述 |
示例 |
结果 |
== |
等于 |
5 == 3 |
0 |
!= |
不等于 |
5 != 3 |
1 |
> |
大于 |
5 > 3 |
1 |
< |
小于 |
5 < 3 |
0 |
>= |
大于等于 |
5 >= 3 |
1 |
<= |
小于等于 |
5 <= 3 |
0 |
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=5return 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 |
其他运算符
运算符 |
描述 |
示例 |
sizeof() |
返回变量或类型的大小 |
sizeof(int) |
& |
取地址运算符 |
&a |
* |
指针运算符 |
*ptr |
?: |
条件运算符 |
a > b ? a : b |
, |
逗号运算符 |
a = (b=3, b+2) → a=5 |
[] |
下标运算符 |
arr[5] |
-> |
结构体指针成员访问 |
ptr->member |
. |
结构体成员访问 |
struct.member |
运算符优先级
从高到低排列:
()
[]
->
.
!
~
++
--
+
-
*
&
(type)
sizeof
*
/
%
+
-
<<
>>
<
<=
>
>=
==
!=
&
^
|
&&
||
?:
=
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
,
代码示例
#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 = 13printf("%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 = 10c += 5; // c = 10 + 5 = 15printf("\n赋值运算: c = %d\n", c); // 输出: c = 15// 条件运算符int max = (a > b) ? a : b; // 10 > 3 为真,所以 max = a = 10printf("最大值: %d\n", max); // 输出: 最大值: 10return 0;
}