一、运算符分类及概念
- 算术运算符
- +(加)、-(减)、*(乘)、/(除)、%(取模)
- 注意:整数相除结果仍为整数(如 5 / 2 = 2);取模运算要求操作数为整数。
- 关系运算符
- ==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
- 结果:返回 0(假)或 1(真)。
- 逻辑运算符
- &&(逻辑与)、||(逻辑或)、!(逻辑非)
- 短路特性:&& 左侧为假时,右侧不计算;|| 左侧为真时,右侧不计算。
- 位运算符
- &(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)
- 作用:直接操作二进制位(如 5 & 3 = 1)。
- 赋值运算符
- =(赋值)、+=(加后赋值)、-=、*=、/=、%= 等复合运算符。
- 示例:a += 5 等价于 a = a + 5。
- 条件运算符
- ? :(三元运算符),语法:条件 ? 表达式1 : 表达式2。
- 示例:max = (a > b) ? a : b。
- 逗号运算符
- ,(按顺序执行表达式,整体值为最后一个表达式的值)。
- 示例:int g = (b = 5, a + b),先赋值 b=5,再计算 a + b。
- 其他运算符
- sizeof(求大小)、&(取地址)、*(指针解引用)、自增/自减(++、–)等。
二、知识点与记忆技巧
- 优先级与结合性
- 优先级:括号 > 单目运算符 > 算术 > 关系 > 逻辑 > 赋值 > 逗号。
- 结合性:大部分左结合,赋值运算符右结合(如 a = b = c 等价于 a = (b = c))。
- 理解与记忆方法
- 分类记忆:按功能分类(算术、逻辑、位操作等)。
- 符号联想:&& 像“且”,|| 像“或”;<< 左移放大,>> 右移缩小。
- 常见用例:用 a++ 实现循环计数,用 % 判断奇偶,用 ?: 简化条件赋值。
三、代码示例与逐行解释
#include <stdio.h>
int main() {
int a = 10, b = 3, c; // 初始化a=10,b=3,c未赋值
c = a + b; // 算术加:c=10+3=13
c = a % b; // 取模:c=10%3=1(余数)
int d = (a > b); // 关系运算:10>3为真,d=1
int e = (a > 5) && (b < 5); // 逻辑与:1 && 1=1,e=1
c = a & b; // 位与:10(1010)& 3(0011)= 2(0010)
a += 5; // 复合赋值:a=10+5=15
int f = (a > 10) ? 20 : 0; // 条件运算:a=15>10,f=20
int g = (b = 5, a + b); // 逗号运算:先赋值b=5,再计算g=15+5=20
printf("c=%d, d=%d, e=%d, f=%d, g=%d\n", c, d, e, f, g);
return 0;
}
输出结果:
c=2, d=1, e=1, f=20, g=20
四、代码逐行解析
- int a = 10, b = 3, c;
- 定义整型变量 a、b 并初始化为 10 和 3,c 未初始化。
- c = a + b;
- 计算 a + b(10+3),结果 13 赋值给 c。
- c = a % b;
- 计算 a % b(10除以3的余数),结果 1 覆盖 c 的原值。
- int d = (a > b);
- 判断 a > b(10 > 3),结果为真(1),赋值给 d。
- int e = (a > 5) && (b < 5);
- 逻辑与运算:(10>5) 为真,(3<5) 为真,结果 1 赋值给 e。
- c = a & b;
- 按位与运算:10(二进制 1010)和 3(0011)按位与,结果为 2(0010)。
- a += 5;
- 复合赋值:a = a + 5(10+5=15),更新 a 的值。
- int f = (a > 10) ? 20 : 0;
- 条件运算符:a=15 > 10 为真,f 被赋值为 20。
- int g = (b = 5, a + b);
- 逗号运算符:先执行 b = 5,再计算 a + b(15+5=20),结果赋值给 g。
- printf(…);
- 输出变量值:c=2(最后赋值),d=1,e=1,f=20,g=20。
五、总结
- 易错点:混淆 =(赋值)和 ==(比较),忽略运算符优先级时多用括号。