运算符

翻译整理自 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 运算符种类繁多,建议不确定时用括号明确顺序。下一章学习控制流。