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
posted @ 2025-04-14 10:55  故渊Y  阅读(355)  评论(0)    收藏  举报