返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 11, 主题|小节 6
进行中

11.5 条件判断的优化技巧

2025年9月22日
课 进展
0% 完成

“在本章中,我们看到了许多使用逻辑运算符构建复杂条件的例子,”我总结道,”下面让我们来探讨一些优化条件判断的技巧。”

11.5.1 逻辑运算符的短路特性

“C++中的逻辑运算符具有短路特性,”我解释道,”这意味着在某些情况下,不需要计算所有条件。”

与运算(&&)的短路特性

  • 如果第一个条件为假,则整个表达式一定为假,不再计算第二个条件
  • 例如:a > 0 && func(),当a <= 0时,不会调用func()函数

或运算(||)的短路特性

  • 如果第一个条件为真,则整个表达式一定

  • 如果第一个条件为真,则整个表达式一定为真,不再计算第二个条件

  • 例如:a < 0 || func(),当a < 0时,不会调用func()函数

短路特性的应用: 可以利用短路特性优化代码,将计算量小的条件或更可能导致短路的条件放在前面:

// 优化前
if(复杂计算() && 简单条件) { ... }

// 优化后
if(简单条件 && 复杂计算()) { ... }

11.5.2 德摩根定律的应用

“德摩根定律在条件表达式优化中非常有用,”我继续说道,”它可以帮助我们重写复杂的条件表达式。”

德摩根定律

  • !(A && B) 等价于 !A || !B
  • !(A || B) 等价于 !A && !B

应用示例: 在实验二(判断三角形)中,我们看到了德摩根定律的应用:

// 原始条件
if(a + b > c && a + c > b && b + c > a)

// 使用德摩根定律转换
if(!(a + b <= c || a + c <= b || b + c <= a))

通过德摩根定律,我们可以根据具体问题选择更直观的表达方式。

11.5.3 避免冗余计算

“在条件判断中,避免重复计算是一种重要的优化技巧,”我说,”我们可以使用变量存储中间结果。”

示例

// 优化前
if(表达式 > 阈值 && 表达式 < 上限) { ... }

// 优化后
int result = 表达式;
if(result > 阈值 && result < 上限) { ... }

对于多次使用的条件结果,预先计算并存储可以提高代码效率。

11.5.4 条件表达式的可读性

“条件表达式不仅要正确,还要易于理解,”我强调道,”以下是一些提高可读性的技巧。”

拆分复杂条件

// 拆分前
if((a > b && c > d) || (e > f && g > h)) { ... }

// 拆分后
bool condition1 = (a > b && c > d);
bool condition2 = (e > f && g > h);
if(condition1 || condition2) { ... }

使用括号明确优先级

// 不清楚的优先级
if(a > b && c > d || e > f) { ... }

// 使用括号明确优先级
if((a > b && c > d) || e > f) { ... }