首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解C#中的冒泡嗡嗡声

了解C#中的冒泡嗡嗡声
EN

Stack Overflow用户
提问于 2013-05-17 22:32:26
回答 5查看 3.1K关注 0票数 0

在C#中使用"while“循环求解”冒泡蜂鸣“时,我发现首先应该找到3和5的倍数(15的倍数),然后找到3和5的倍数,如下所示。

代码语言:javascript
复制
int myval = 0;

while (myval < 100)
{
    myval = myval + 1;

    if (myval % 15 == 0)
    {
        listBox1.Items.Add("fizzbuzz");
    }
    else if (myval % 3 == 0)
    {
        listBox1.Items.Add("fizz");
    }
    else if (myval % 5 == 0)
    {
        listBox1.Items.Add("buzz");
    }
    else
    {
        listBox1.Items.Add(myval);
    }
}

但是如果我先写代码过滤3和5的倍数,然后像下面这样同时过滤3和5的倍数(15的倍数),那么最终结果只显示了冒泡(3的倍数)和嗡嗡(5的倍数),而没有冒泡-嗡嗡(3和5的倍数)。有人知道这是什么原因吗?即使IDE没有显示任何错误。

代码语言:javascript
复制
myval = 0;

while (myval < 100)
{
    myval = myval + 1;

    if (myval % 3 == 0)
    {
        listBox1.Items.Add("fizz");
    }
    else if (myval % 5 == 0)
    {
        listBox1.Items.Add("buzz");
    }
    else if (myval % 15 == 0)
    {
        listBox1.Items.Add("fizzbuzz"); // for multiples of both 3 and 5  
    }
    else
    {
        listBox1.Items.Add(myval);
    }
}

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-17 22:34:27

归根结底,if-else语句是按顺序处理的。一旦遇到计算结果为true的条件,就会跳过其他else if子句。

假设ab都是true。当你写的时候

代码语言:javascript
复制
if (a) {
    Foo1();
}
else if (b) {
    Foo2();
}

您不能同时执行Foo1Foo2。由于atrue,因此将执行Foo1,甚至不计算b

现在考虑一下你的问题。考虑数字15,所有3个候选因子,3,5和15,都除以这个数字。

代码语言:javascript
复制
if (myval % 3 == 0)
{
    listBox1.Items.Add("fizz");
}
else if (myval % 5 == 0)
{
    listBox1.Items.Add("buzz");
}
else if (myval % 15 == 0)
{
    listBox1.Items.Add("fizzbuzz"); // for multiples of both 3 and 5  
}
else
{
    listBox1.Items.Add(myval);
}

由于15的倍数也是3 (和5)的倍数,因此您将永远不会达到15的倍数的myval % 15 == 0测试。

票数 4
EN

Stack Overflow用户

发布于 2013-05-17 22:35:17

因为它满足前两个条件。所以它永远不会命中你的第三个else语句。

票数 6
EN

Stack Overflow用户

发布于 2013-05-17 22:35:39

这是因为可以被3和5整除的东西也可以被3和5整除。如果你首先捕获了这两个条件中的任何一个,那么后面的条件永远不会被检查。

你也可以这样写它:

代码语言:javascript
复制
var resultString = "";
if(myval % 3 == 0) resultString += "fizz";
if(myval % 5 == 0) resultString += "buzz";
if(myval % 5 != 0 && myval % 3 != 0) resultString += myval;
listBox1.Items.Add(resultString);

这将打印所有条件,而不需要单独检查% 15。

此外,我知道这不是最初的问题,但通常有人不会使用while循环来遍历一系列数字。为此,请使用for循环:

代码语言:javascript
复制
for( int myval = 0; myval <= 100; myval++)
{
    // code goes here
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16611626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档