【问题标题】:How do nested if...else statements outperform a series of single-selection if statements in C++嵌套 if...else 语句如何优于 C++ 中的一系列单选 if 语句
【发布时间】:2020-07-16 17:54:13
【问题描述】:

我正在阅读 Paul 和 Harvey Deitel 的C++:如何编程,第九版,我在第 114 页发现了一些让我有些困惑的东西。

书中给出了示例代码:

if ( studentGrade >= 90 ) // 90 and above gets "A"
    cout << "A";
else
    if ( studentGrade >= 80 ) // 80-89 gets "B"
        cout << "B";
    else
        if ( studentGrade >= 70 ) // 70-79 gets "C"
            cout << "C";
        else
            if ( studentGrade >= 60 ) // 60-69 gets "D"
                cout << "D";
            else // less than 60 gets "F"
                cout << "F";

这本书接着说:

大多数程序员将前面的语句写成:

if ( studentGrade >= 90 ) // 90 and above gets "A"
    cout << "A";
else if ( studentGrade >= 80 ) // 80-89 gets "B"
    cout << "B";
else if ( studentGrade >= 70 ) // 70-79 gets "C"
    cout << "C";
else if ( studentGrade >= 60 ) // 60-69 gets "D"
    cout << "D";
else // less than 60 gets "F"
    cout << "F";

这两种形式是相同的,除了间距和缩进,编译器会忽略。后一种形式很受欢迎,因为它 避免代码向右深度缩进,这可能会强制 要换行的行。

在其下方有一个标记为Performance Tip 4.1的框:

嵌套的 if...else 语句比一系列单选 if 语句的执行速度要快得多,因为在满足一个条件后可能会提前退出。

我不太明白这一点,因为(我假设“一系列单选 if 语句”表示第二个代码示例,在同一缩进上使用 if...else if;非常流行的样式)根据我对 C 和 C++ 的了解,当 if 语句或以下 else if 语句之一被测试为正确时,其余的 else if 语句甚至都没有经过测试,它们只是被跳过了。那不是和早退一样吗?另外,书上说,就编译器而言,这两种形式是相同的,为什么一种会胜过另一种呢?

【问题讨论】:

  • 第一个示例的缩进反映了编译器如何构造其代码的内部 AST 表示。第二个例子反映了大多数程序员如何使用和思考 if/else-if/else 多臂逻辑。

标签: c++ performance if-statement


【解决方案1】:

书中没有显示“一系列单选 if 语句”。它与您显示的两个代码示例类似,但没有 else 关键字。但是,您必须添加一些代码来排除较早的情况。

if ( studentGrade >= 90 ) // 90 and above gets "A"
    cout << "A";
if (studentGrade < 90 && studentGrade >= 80 ) // 80-89 gets "B"
    cout << "B";
if (studentGrade < 80 && studentGrade >= 70 ) // 70-79 gets "C"
    cout << "C";
if (studentGrade < 70 && studentGrade >= 60 ) // 60-69 gets "D"
    cout << "D";
if (studentGrade < 60) // less than 60 gets "F"
    cout << "F";

除了必须运行你知道会是假的测试(在输出成绩之后)之外,后面的测试更复杂,并且在那些扩展测试中很容易出错(或者忘记排除早期的情况) ,或未正确键入排除项)。所有这些额外的代码也使代码在阅读时更难理解。

所以使用if else 链对于性能、代码可读性和代码维护来说更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多