C语言基本笔记(7)—— 基本逻辑运算和逻辑代数
C语言中的逻辑运算
常用逻辑运算
| 运算符 | 名称 | 描述 | 示例 |
|---|---|---|---|
&& |
逻辑与 | 当所有条件为真时结果为真 | if (a > 0 && b < 5) |
|| |
逻辑或 | 当至少一个条件为真时结果为真 | if (x == 0 || y == 0) |
! |
逻辑非 | 对布尔值取反 | if (!is_valid) |
- 逻辑与(
&&):若左侧为假,右侧不再执行。 - 逻辑或(
||):若左侧为真,右侧不再执行。
逻辑运算 vs. 位运算
| 特性 | 逻辑运算 | 位运算 |
|---|---|---|
| 操作对象 | 布尔值(隐式转换为0或非0) |
整型数值的二进制位 |
| 结果类型 | 0(假)或1(真) |
整型数值(按位计算结果) |
| 短路特性 | 支持(优化执行路径) | 不支持(始终计算所有位) |
| 典型用途 | 条件分支、循环控制 | 位掩码、硬件寄存器操作、数据压缩 |
常见混淆示例
int a = 5, b = 3;
// 逻辑与:结果为1(true)
if (a && b) { /* 执行 */ }
// 位与:结果为1(0b101 & 0b011 = 0b001 → 1)
if (a & b) { /* 执行 */ }
// 但若 a=0, b=3:
// 逻辑与:结果为0(false)
// 位与:结果为0(0b000 & 0b011 = 0)
注意事项
1. 隐式类型转换
- C语言将非零值视为
true,零值视为false,需注意意外转换:int x = 10; if (x) { /* x非零,条件为真 */ }
2. 运算符优先级
- 逻辑非(
!) > 关系运算符(>、==等) > 逻辑与(&&) > 逻辑或(||)if (a > 0 && b < 5 || c == 10) // 等价于:if ((a > 0 && b < 5) || c == 10)
3. 避免副作用
- 短路求值可能导致右侧表达式未被执行:
if (a > 0 && (b = func()) > 0) { // 若a<=0,func()不会执行,b的值可能未更新 }
4. 可读性优化
- 复杂逻辑建议用括号明确优先级,或拆分为多步:
// 不推荐 if (a || b && c || d) // 推荐 if (a || (b && c) || d)
经典应用示例
1. 范围检查
// 检查数值是否在[0, 100]区间
if (value >= 0 && value <= 100) {
// 合法值处理
}
2. 错误处理
// 文件操作:检查是否打开成功且可读
FILE* fp = fopen("data.txt", "r");
if (fp != NULL && !ferror(fp)) {
// 安全读取文件
}
3. 状态机控制
enum State { IDLE, RUNNING, ERROR };
enum State current_state = IDLE;
// 状态迁移条件
if (current_state == IDLE && start_signal) {
current_state = RUNNING;
} else if (current_state == RUNNING && (error_flag || stop_signal)) {
current_state = ERROR;
}
逻辑代数与基本定律
一、基本逻辑运算
1. 逻辑与(AND,合取)
-
符号:
∧、·、&&(编程中) -
定义:当且仅当所有输入为1时,输出为1。
-
真值表:
A B A ∧ B 0 0 0 0 1 0 1 0 0 1 1 1 -
应用:条件同时满足时触发操作,如安全系统的多重验证。
2. 逻辑或(OR,析取)
-
符号:
∨、+、||(编程中) -
定义:当至少一个输入为1时,输出为1。
-
真值表:
A B A ∨ B 0 0 0 0 1 1 1 0 1 1 1 1 -
应用:多个条件中满足任意一个时执行操作,如报警触发条件。
3. 逻辑非(NOT,否定)
-
符号:
¬、~、!(编程中) -
定义:输入取反。
-
真值表:
A ¬A 0 1 1 0 -
应用:条件反转,如禁用某个功能时取反判断。
4. 逻辑异或(XOR,互斥或)
-
符号:
⊕、^(编程中) -
定义:当输入不同时输出1,相同时输出0。
-
真值表:
A B A ⊕ B 0 0 0 0 1 1 1 0 1 1 1 0 -
应用:奇偶校验、加密算法中的位操作。
二、常用逻辑定律
1. 基本定律
| 名称 | 公式 | 说明 |
|---|---|---|
| 同一律 | A ∨ 0 = A A ∧ 1 = A |
0是或运算的单位元,1是与运算的单位元。 |
| 零元律 | A ∨ 1 = 1 A ∧ 0 = 0 |
1是或运算的零元,0是与运算的零元。 |
| 对合律 | ¬(¬A) = A |
双重否定等于原值。 |
2. 交换律、结合律、分配律
| 定律 | 公式 |
|---|---|
| 交换律 | A ∨ B = B ∨ A A ∧ B = B ∧ A |
| 结合律 | (A ∨ B) ∨ C = A ∨ (B ∨ C) (A ∧ B) ∧ C = A ∧ (B ∧ C) |
| 分配律 | A ∧ (B ∨ C) = (A ∧ B) ∨ (A ∧ C) A ∨ (B ∧ C) = (A ∨ B) ∧ (A ∨ C) |
3. 德摩根定律(De Morgan's Laws)
- 核心:逻辑与和逻辑或的相互转化。
- 公式:
¬(A ∨ B) = ¬A ∧ ¬B
¬(A ∧ B) = ¬A ∨ ¬B - 应用:简化复杂逻辑表达式,如将条件判断反向组合。
4. 吸收律
- 公式:
A ∨ (A ∧ B) = A
A ∧ (A ∨ B) = A - 意义:冗余项的消除,优化逻辑表达式。
5. 冗余律(消去律)
- 公式:
A ∨ (¬A ∧ B) = A ∨ B
A ∧ (¬A ∨ B) = A ∧ B - 意义:简化含冗余项的表达式。
三、逻辑运算的扩展与应用
1. 复合逻辑运算
- 与非(NAND):
A NAND B = ¬(A ∧ B)- 功能完备:仅用NAND门可实现所有逻辑运算。
- 或非(NOR):
A NOR B = ¬(A ∨ B)- 同样是功能完备的运算符。
2. 逻辑表达式化简
- 目标:减少逻辑门数量,降低电路复杂度。
- 示例:
原式:A ∧ (B ∨ ¬B) ∨ C
化简:A ∧ 1 ∨ C = A ∨ C(利用同一律和零元律)。
3. 数字电路设计
- 组合逻辑电路:通过逻辑门组合实现特定功能(如加法器、编码器)。
- 时序逻辑电路:结合存储单元(触发器)实现状态机(如计数器)。
四、代码示例
1. 条件表达式优化
// 原始条件
if ((x > 0 && y > 0) || (x > 0 && z > 0))
// 应用分配律优化
if (x > 0 && (y > 0 || z > 0))
2. 位运算与逻辑运算结合
// 判断某数是否为奇数
bool is_odd = (num & 1) != 0; // 等价于 (num % 2 != 0)
// 利用异或交换变量
a ^= b; // a = a ^ b
b ^= a; // b = b ^ (a ^ b) = a
a ^= b; // a = (a ^ b) ^ a = b
浙公网安备 33010602011771号