gpt4 book ai didi

c++ - 关于 if block 的情况的排他性

转载 作者:太空宇宙 更新时间:2023-11-04 05:33:27 27 4
gpt4 key购买 nike

我有一个关于良好编码实践的问题。我了解执行 if-else if 和执行多个 if 之间的区别(即,当满足 if-else if 中的条件时>,其余的检查将被跳过)。我找到了一段这样的代码:

if (A == 5) {
do_something();
} else if (B == 7) {
do_something_else();
}

我知道如果 A == 5,这段代码不会检查 B == 7。代码有效,这意味着如果 A 不是 5,B 只有 7,但我认为这只是在等待中断当代码更改时。我会做的是:

if (A == 5) {
do_something();
return or continue or break;
}
if (B == 7) {
do_something_else();
return or continue or break;
}

我的问题是,当我有多个依赖于不同的独占变量的独占案例时,解决流程控制的最佳方法是什么?我的印象是第一个代码(带有 else ifs)在很大程度上取决于其他代码片段的工作,并且其他区域的更改可能会破坏它。第二个似乎有点笨拙。 switch 可能是第三种选择,但我需要创建另一个结构来保存 case 和分配其值的逻辑,我认为这会有点笨拙且违反直觉。

最佳答案

您问的是“排他性”案例,但条件问题 A == 5B == 7是它们不是排他性的;他们是独立的。

为了完全通用,您可能需要测试和处理所有四种情况:

if(A == 5) {
if(B == 7) {
/* case 1 */
} else {
/* case 2 */
}
} else {
if(B == 7) {
/* case 3 */
} else {
/* case 4 */
}
}

这是臭名昭著的“浓密”if/else block 。这是臭名昭著的,因为它几乎可以立即让读者几乎无法理解,尤其是在涉及案例或引入更多级别的情况下。 (我想大多数风格指南都会告诉你永远不要使用 3 层或更多层深的 if/else 树。我肯定会这么说。)

我偶尔会使用这两种替代方法:

(1) 完全解耦案例:

if(A == 5 && B == 7) {
/* case 1 */
} else if(A == 5 && B != 7) {
/* case 2 */
} else if(A != 5 && B == 7) {
/* case 3 */
} else if(A != 5 && B != 7) {
/* case 4 */
} else {
/* can't happen */
}

这里的重点是让后来的读者尽可能清楚地了解情况 1、2、3 和 4 的确切条件。因此,您不妨列出最后一个,else if(A != 5 && B != 7)明确地区分大小写(如我所示),即使到那时它基本上是一个“其他”。

(2) 设计一个“两级”开关。我不能说这是一种常见的技术;它有一种“太聪明”的味道,但它以其方式健壮且可读:

#define PAIR(b1, b2) (((b1) << 8) | (b2))

switch(PAIR(A == 5), (B == 7)) {
case PAIR(TRUE, TRUE):
/* case 1 */
break;

case PAIR(TRUE, FALSE):
/* case 2 */
break;

case PAIR(FALSE, TRUE):
/* case 3 */
break;

case PAIR(FALSE, FALSE):
/* case 4 */
break;
}

当条件为 A == 5 时,我不推荐这样做和 B == 7 ,因为当你按下开关时,“真”和“假”是什么意思并不明显,但有时,这种东西可以读得很清楚。它也完全适合 3 层或更多层的嵌套,不像“浓密的”if/else 树,正如我所说,后者是出了名的不可读。

关于c++ - 关于 if block 的情况的排他性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50656651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com