Z
ZHANK

运算符

算术、关系、逻辑、位、赋值、三元运算符及优先级

运算符

C 语言运算符密度大、优先级多——但核心和数学没两样。关键是区别 ===、避免优先级陷阱。

学完本章你将: 掌握算术/关系/逻辑/位/三元运算符、自增自减、优先级。


算术运算符

c
int a = 10, b = 3;
printf("%d\n", a + b);   // 13 加法
printf("%d\n", a - b);   // 7  减法
printf("%d\n", a * b);   // 30 乘法
printf("%d\n", a / b);   // 3  整数除法(截断!)
printf("%d\n", a % b);   // 1  取余

// 类型转换
printf("%f\n", 10.0 / 3);  // 3.333333(浮点除法)
printf("%f\n", (float)10 / 3);  // 3.333333(强制转换)

自增自减

c
int a = 5;
int b = a++;    // b = 5, a = 6(先用后加)
int c = ++a;    // c = 7, a = 7(先加后用)

// ⚠️ 不要在一个表达式里多次修改同一个变量
// int x = a++ + ++a;  // 行为未定义!

关系与逻辑运算符

c
// 关系:>  <  >=  <=  ==  !=
if (a == 10) { }        // ✅ 判断相等
// if (a = 10) { }      // ❌ 赋值!永远为真!

// 逻辑:&& || !
if (a > 0 && a < 100) { }  // 短路求值
if (a < 0 || a > 100) { }  // 有一个为真即可
if (!(a == 0)) { }         // 等价于 a != 0

位运算符(C 的杀手锏)

c
int a = 5;          // 0101
int b = 3;          // 0011
printf("%d\n", a & b);   // 0001 = 1(按位与)
printf("%d\n", a | b);   // 0111 = 7(按位或)
printf("%d\n", a ^ b);   // 0110 = 6(按位异或)
printf("%d\n", ~a);      // 按位取反
printf("%d\n", a << 1);  // 1010 = 10(左移 = *2)
printf("%d\n", a >> 1);  // 0010 = 2(右移 = /2)

运算符优先级速记

c
// 从上到下优先级递减
1. ()  []  ->  .
2. !  ~  ++  --  &  *  (一元)
3. *  /  %
4. +  -
5. <<  >>
6. <  <=  >  >=
7. ==  !=
8. &&
9. ||
10. =  +=  -=  *=  /=  ...(赋值)

// 不确定就加括号!
// if (a & 0x1 == 0)     // ❌ == 比 & 优先级高 → a & (0x1==0)
// if ((a & 0x1) == 0)   // ✅ 括号显式控制