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

标签 c++ c

我有一个关于良好编码实践的问题。我了解执行 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/

相关文章:

c++ - 如何在 C++ 中单独锁定 unordered_map 元素

C++ - LNK2019 错误未解析的外部符号 [模板类的构造函数和析构函数] 在函数 _main 中引用

c - C 中的指针和段错误?

c - sqlite3(C语言): no such column

c++ - 规则为 3 的 SinglyLinkedList 实现

C++17 枚举类型声明

c++ - ISO C++ 15.3.10 : Why is this undefined behaviour?

c - 在链表中存储行 (c)

c - Union 比 C 中的 Structure 更好的选择的场景

c - 如何正确关闭管道