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