我尝试在 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
而不仅仅是 FizzBuzz
。所有(仅)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
的所有倍数也是 3
和 5
的倍数,因此您会将这三个都打印在屏幕上。
另一种情况:
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
),如果为假,将测试第二种情况,如果为假,将测试第三种情况。这意味着每次迭代只有四种情况中从上到下的第一个会测试为真。
例如,如果您要颠倒 5
和 15
的顺序:
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
测试,因此打印 FizzBuzz
。
关于c++ - fizzbuzz 中 if 与 if else if 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31933236/