C语言---运算符
文章目录
- 1. 算术运算符
- 2. 关系运算符
- 3. 逻辑运算符
- 4. 位运算符
- 5. 赋值运算符
- 6. 条件运算符(三目运算符)
- 7. 逗号运算符
- 8. sizeof 运算符
- 9. 指针运算符
- 10. 特殊运算符
- 运算符优先级和结合性
运算符是告诉编译器执行特定数学或逻辑操作的符号,是构成表达式的基础。
1. 算术运算符
用于执行基本的数学运算。
运算符 | 描述 | 示例 (a=10, b=3) | 结果 |
---|---|---|---|
+ | 加法 | a + b | 13 |
- | 减法 | a - b | 7 |
* | 乘法 | a * b | 30 |
/ | 除法 | a / b | 3 |
% | 取模(求余数) | a % b | 1 |
++ | 自增 | a++ 或 ++a | a 变为 11 |
– | 自减 | a-- 或 --a | a 变为 9 |
注意: | |||
/ 除法:当两个整数相除时,结果也是整数,小数部分被截断(不是四舍五入)。例如 10 / 3 结果是 3,10.0 / 3 结果是 3.333…。 | |||
% 取模:要求两个操作数必须为整数。 | |||
++ 和 --: | |||
前缀 (++a/–a):先自增/自减,然后返回新值。 | |||
后缀 (a++/a–):先返回原值,然后自增/自减。 |
int a = 10, b;
b = ++a; // a 先变成 11,然后 b 被赋值为 11
// 现在 a=11, b=11a = 10;
b = a++; // b 先被赋值为 10,然后 a 变成 11
// 现在 a=11, b=10
2. 关系运算符
用于比较两个值,返回 1 (真) 或 0 (假)。
运算符 | 描述 | 示例 (a=10, b=20) | 结果 |
---|---|---|---|
== | 等于 | a == b | 0 |
!= | 不等于 | a != b | 1 |
> | 大于 | a > b | 0 |
< | 小于 | a < b | 1 |
>= | 大于等于 | a >= b | 0 |
<= | 小于等于 | a <= b | 1 |
3. 逻辑运算符
用于连接多个条件,返回 1 (真) 或 0 (假)。
运算符 | 描述 | 示例 | 解释 |
---|---|---|---|
&& | 逻辑与 | (a > 5) && (b < 5) | 两个条件都为真,结果才为真 |
|| | 逻辑或 | (a > 5) || (b < 5) | 两个条件有一个为真,结果就为真 |
! | 逻辑非 | !(a > 5) | 逆转操作数的逻辑状态 |
注意:逻辑运算符支持“短路求值” |
A && B:如果 A 为假,则不会计算 B。A || B:如果 A 为真,则不会计算 B。
4. 位运算符
直接在数据的二进制位上操作,只能用于 char 和 int 等整型。
运算符 | 描述 | 示例 (a=60, b=13) a=0011 1100, b=0000 1101 |
---|---|---|
& | 按位与 | a & b = 0000 1100 (12) |
| | 按位或 | a | b = 0011 1101 (61) |
^ | 按位异或 | a ^ b = 0011 0001 (49) |
~ | 按位取反 | ~a = 1100 0011 (-61,取决于位数和表示法) |
<< | 左移 | a << 2 = 1111 0000 (240) |
>> | 右移 | a >> 2 = 0000 1111 (15) |
注意: |
左移 <<:高位丢弃,低位补 0。相当于乘以 2^n。
右移 >>:
对无符号数,低位丢弃,高位补 0。
对有符号数,低位丢弃,高位补符号位(算术右移)。
相当于除以 2^n(向下取整)。
5. 赋值运算符
用于给变量赋值。
运算符 | 示例 | 等价于 |
---|---|---|
= | 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 <<= 2 | a = a << 2 |
>>= | a >>= 2 | a = a >> 2 |
&= | a &= b | a = a & b |
^= | a ^= b | a = a ^ b |
6. 条件运算符(三目运算符)
C 语言中唯一需要三个操作数的运算符。
语法: 条件 ? 表达式1 : 表达式2
执行过程: 如果条件为真,则整个表达式取 表达式1 的值,否则取 表达式2 的值。
int a = 10, b = 20, max;
max = (a > b) ? a : b; // 因为 a> b 为假,所以 max 被赋值为 b (20)
7. 逗号运算符
用于将多个表达式连接在一起。整个逗号表达式的值是最后一个表达式的值,计算顺序从左到右。
int a, b, c;
c = (a = 5, b = a + 3, a + b);
// 执行过程:a被赋值为5 -> b被赋值为8 -> c被赋值为a+b(5+8)=13
8. sizeof 运算符
用于计算变量、类型或数据结构在内存中所占的字节数。它是一个编译时运算符,返回值类型是 size_t。
int arr[10];
printf("Size of int: %zu\n", sizeof(int)); // 通常是 4
printf("Size of variable a: %zu\n", sizeof(a));
printf("Size of entire array: %zu\n", sizeof(arr)); // 4 * 10 = 40
9. 指针运算符
运算符 | 描述 | 示例 |
---|---|---|
& | 取地址运算符,返回变量的内存地址 | &a |
* | 解引用运算符,返回指针所指地址的值 | *ptr |
10. 特殊运算符
运算符 | 描述 | 示例 |
---|---|---|
[] | 数组下标 | arr[5] |
() | 函数调用 | printf(…) |
. | 结构体成员访问 | struct.member |
-> | 通过指针访问结构体成员 | ptr->member |
(type) | 强制类型转换 | (float) a |
运算符优先级和结合性
当多个运算符出现在同一个表达式中时,优先级决定了谁先计算,结合性决定了相同优先级运算符的计算顺序(从左到右还是从右到左)。
(), [], ->, . (从左到右)
大致规律(从高到低):
单目运算符:!, ~, ++, --, +(正), -(负), *(解引用), &(取址), sizeof, (type) (从右到左)
算术运算符:*, /, % -> +, - (从左到右)
移位运算符:<<, >> (从左到右)
关系运算符:<, <=, >, >= -> ==, != (从左到右)
位运算符:& -> ^ -> | (从左到右)
逻辑运算符:&& -> || (从左到右)
条件运算符:?: (从右到左)
赋值运算符:=, +=, -= 等 (从右到左)
逗号运算符:, (从左到右)图片来自菜鸟教程:https://www.runoob.com/cprogramming/c-operators.html
注意:使用括号 () 来明确指定计算顺序!这是最安全、最清晰的做法。