运算符
算术、关系、逻辑、位、赋值、三元运算符及优先级
运算符
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) // ✅ 括号显式控制