运算符
翻译整理自 cppreference - 运算符。
1. 算术运算符
3 + 2; // 5
3 - 2; // 1
3 * 2; // 6
7 / 2; // 3 ← 整数除法截断
7.0 / 2; // 3.5
7 % 2; // 1 ← 仅对整数
-7 / 2; // -3 ← C99 起向 0 取整
2. 自增自减
int i = 0;
i++; // 后置自增,结果为 0,i 变 1
++i; // 前置自增,结果与 i 都是 2
i--; // 2 → 1
--i; // 0
3. 关系与逻辑
a == b; a != b;
a < b; a > b;
a <= b; a >= b;
&& // 逻辑与(短路)
|| // 逻辑或(短路)
! // 逻辑非
C 中没有真正的布尔类型(C99 之前),用 0/非 0 表示:
int flag = 1;
if (flag) { /* true */ }<stdbool.h> 提供 bool/true/false(C99+):
#include <stdbool.h>
bool ok = true;4. 位运算
0xff & 0x0f; // 0x0f
0xff | 0x100; // 0x1ff
0xff ^ 0x0f; // 0xf0
~0xff; // 0xffffff00 (32-bit)
0x01 << 4; // 0x10
0x80 >> 4; // 0x08
5. 赋值运算符
= += -= *= /= %=
&= |= ^= <<= >>=int x = 5;
x += 3; // x = 8
x <<= 2; // x = 32
6. 三目运算符
int max = (a > b) ? a : b;7. 逗号运算符
int a = (1, 2, 3); // a = 3,从左到右求值,结果取最右
常见用法:
for (i = 0, j = n - 1; i < j; i++, j--) {
swap(&arr[i], &arr[j]);
}8. 运算符优先级(节选)
从高到低:
() [] -> .
! ~ ++ --
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= ...
,不确定时加括号永远是对的。
9. sizeof 与 _Alignof
sizeof(int); // 4
sizeof arr; // 整个数组大小
_Alignof(double); // 8 (C11)
10. 表达式求值陷阱
- 未定义行为(UB):
i = i++ + ++i;结果未定义 - 副作用顺序未指定:
f(i++, i);参数求值顺序未指定 - 有符号整数溢出 是 UB
小结
C 运算符种类繁多,建议不确定时用括号明确顺序。下一章学习控制流。