c++ - fizzbuzz 中 if 与 if else if 之间的区别

标签 c++ fizzbuzz

我尝试在 C++ 中实现 fizzbuzz,但对以下代码示例产生的不同输出感到困惑:

int main()
{
    int val1 = 1;
    while (val1 < 101) {
        if (val1 % 15 == 0)
            cout << "FizzBuzz\n";
        if (val1 % 3 == 0)
            cout << "Fizz\n";
        if (val1 % 5 == 0)
            cout << "Buzz\n";
        else cout << val1 << "\n";
        ++val1;
    }
    keep_window_open();
}

对于所有 15 的倍数,此代码输出

FizzBuzz
Fizz
Buzz

而不仅仅是 FizzBu​​zz。所有(仅)5 的倍数都被正确替换为 Buzz,但所有 3 的倍数都打印出 Fizz,然后是数字本身。

但是,以下代码可以完美运行。我知道 else if 使它正常工作,但我只是看不到 val1 = 3、5 或 15 时的代码路径。

int main()
{
    int val1 = 1;
    while (val1 < 101) {
        if (val1 % 15 == 0)
            cout << "FizzBuzz\n";
        else if (val1 % 3 == 0)
            cout << "Fizz\n";
        else if (val1 % 5 == 0)
            cout << "Buzz\n";
        else cout << val1 << "\n";
        ++val1;
    }
    keep_window_open();
}

最佳答案

在第一个例子中:

    if (val1 % 15 == 0)
        cout << "FizzBuzz\n";
    if (val1 % 3 == 0)
        cout << "Fizz\n";
    if (val1 % 5 == 0)
        cout << "Buzz\n";
    else cout << val1 << "\n";

每个案例都将在每次迭代中进行测试。由于 15 的所有倍数也是 35 的倍数,因此您会将这三个都打印在屏幕上。

另一种情况:

    if (val1 % 15 == 0)
        cout << "FizzBuzz\n";
    else if (val1 % 3 == 0)
        cout << "Fizz\n";
    else if (val1 % 5 == 0)
        cout << "Buzz\n";
    else cout << val1 << "\n";

将测试第一种情况 (val1 % 15 == 0),如果为假,将测试第二种情况,如果为假,将测试第三种情况。这意味着每次迭代只有四种情况中从上到下的第一个会测试为真。

例如,如果您要颠倒 515 的顺序:

    if (val1 % 5 == 0)
        cout << "FizzBuzz\n";
    else if (val1 % 3 == 0)
        cout << "Fizz\n";
    else if (val1 % 15 == 0)
        cout << "Buzz\n";
    else cout << val1 << "\n";

你会得到 Buzz 永远不会被打印,因为如果这个值可以被 15 整除,你会停止第一个 val1 % 5 == 0 测试,因此打印 FizzBu​​zz

关于c++ - fizzbuzz 中 if 与 if else if 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31933236/

相关文章:

c++ - C++ FAQ的不安全宏解释?

haskell - FizzBu​​zz 清理

javascript - 用于检查 NaN 和空字符串的 If...else 语句在 JavaScript 中不起作用

haskell - Haskell 中的 fizzbuzz ?

python - 在 fizzbuzz 中,为什么使用字典的程序认为 0 是 fizzbuzz?

c++ - 如何从 GCC/clang 程序集输出中删除 "noise"?

c++ - 当不抛出 bad_alloc 时,保证 `new` 不抛出是什么意思

c++ - 传递对 C++ 构造函数的引用并将它们保存为引用或非引用类型

java - 为什么我的 FizzBu​​zz 代码在两个 if 语句都匹配时不处理它们?

c++ - 如何跳过文本文件中的标题行并将其余数据读回主函数?