在while循环中使用if语句

时间:2015-04-28 08:25:49

标签: javascript if-statement while-loop

我只是想出了如何测试某些条件并修改循环内的输出。但是我注意到,使用&&运算符测试两个条件只能在if/else if/else if/else链中工作,如果它是第一个被测试的。

有人可以解释为什么会有效:

var number = 0;
var counter = 0;

while (counter < 100) {
  number ++;
  counter ++;
  if (number % 3 == 0 && number % 5 == 0)
    console.log ("FizzBuzz");
  else if (number % 3 == 0)
    console.log("Fizz");
  else if (number % 5 == 0)
    console.log("Buzz");
  else
    console.log(number);
}

但这不是吗?:

var number = 0;
var counter = 0;

while (counter < 100) {
  number ++;
  counter ++;
  if (number % 3 == 0)
    console.log("Fizz");
  else if (number % 5 == 0)
    console.log("Buzz");
  else if (number % 3 == 0 && number % 5 == 0)
    console.log ("FizzBuzz");
  else
    console.log(number);
}

6 个答案:

答案 0 :(得分:3)

else if,顾名思义,只会在之前的if失败时执行。因此,语句else if (number % 3 == 0 && number % 5 == 0)仅在if (number % 3 == 0)else if (number % 5 == 0)失败时才会执行。如果数字是3和5的倍数,则第一个if成功执行,其余ifselse-ifs将被忽略。

然而,在代码1中,ifselse-ifs的排序是这样的,如果一个数字可以被3&amp; 5,然后执行第一个if,如果它只能被3整除,则不执行第一个if,只执行else if (number % 3 == 0)

答案 1 :(得分:2)

你想测试这个数字是否可以被3和5整除,但在你这样做之前,你要测试它是否可以被3整除。

它是,因此它遵循逻辑分支,并且从不试图测试它是否可被3和5整除。

答案 2 :(得分:2)

因为在你的测试中,如果数字是3或5的倍数,那么相应的if statemetn将在到达number % 3 == 0 && number % 5 == 0语句之前执行,因此它永远不会被执行。

让我们假设数字为33,第一次测试将成为正确的成功,但如果数字为15则再次第一次if成功,因为15是3的倍数,所以即使它是5的倍数,第3个条件也没有机会执行

为了使其正确,您可能需要类似下面的内容,如果数字是两个版本的倍数,我们首先跳过2个条件

var number = 0;
var counter = 0;

while (counter < 100) {
    number++;
    counter++;
    if (number % 3 == 0 && number % 5 != 0) {
        console.log("Fizz");
    } else if (number % 5 == 0 && number % 3 != 0) {
        console.log("Buzz");
    } else if (number % 3 == 0 && number % 5 == 0) {
        console.log("FizzBuzz");
    } else {
        console.log(number);
    }
}

答案 3 :(得分:2)

在第二个版本中删除了可被3整除或可被5整除的所有内容。当它检查一个数字是否可以被3 整除并且可被5整除时,它就不可能是真的,因为前两个子句中的一个已被评估为真。

考虑这个伪代码

if( A || B  ) return;
if( A && B ) //this code will never execute

然后将A视为number % 3 == 0,将B视为number % 5 == 0。这基本上就是发生了什么,以及为什么最后一个if语句永远不会执行。

答案 4 :(得分:2)

您实际想要测试的是

if      (number % 3 == 0 && number % 5 == 0) …
else if (number % 3 == 0 && number % 5 != 0) …
else if (number % 3 != 0 && number % 5 == 0) …
else if (number % 3 != 0 && number % 5 != 0) …

如果您要写出这四个案例。

只有你不需要那么明确,因为当以前的条件已经不匹配(并且你在else分支中)时,那些{{ 1}} 隐含,您可以省略它们。但是,订单很重要,因为条件是连续测试的。

因此,如果您拥有完全合格的条件,您可以随意洗牌:

!= 0

然后继续简化条件,省略其父案例已隐含的部分:

if      (number % 3 == 0 && number % 5 != 0) … // move to front
else if (number % 3 != 0 && number % 5 == 0) …
else if (number % 3 == 0 && number % 5 == 0) …
else if (number % 3 != 0 && number % 5 != 0) …

条件的其他排列让我们尽可能少地使用原始示例,例如

if (number % 3 == 0 && number % 5 != 0)
    console.log("Fizz");
else if (number % 3 != 0 && number % 5 == 0) // (an == instead of the && would suffice)
    console.log("Buzz");
else if (number % 3 == 0) // as it didn't match the first condition, we know that % 5 == 0
    console.log("FizzBuzz");
else // here we know that % 3 != 0 && % 5 != 0
    console.log(numer);

通过嵌套可以实现最小数量的测试:

if (number % 3 == 0 && number % 5 != 0)
    console.log("Fizz");
else if (number % 3 == 0) // as it didn't match the first condition, we know that % 5 == 0
    console.log("FizzBuzz");
else if (number % 5 == 0) // as it didn't match the first condition, we know that % 3 != 0
    console.log("Buzz");
else // here we know that % 3 != 0 && % 5 != 0
    console.log(numer);

答案 5 :(得分:2)

让我们使用数字61015作为示例。

数字6将在您的第一个示例(工作示例)中执行 - 第二个if块,因为在第一个中,第三个和第四个块将不满足条件忽略,并且 - 在你的第二个例子(不工作的例子)中 - 将执行第一个if块并忽略后面的其他块。

数字10将会执行 - 在您的第一个示例中 - 第三个块,因为第一个块和第二个块不满足,而第四个块将被忽略,并且 - 在您的第二个例子 - 将执行第二个块,因为不满足第一个块中的条件,而后面的块将被忽略。

数字15将执行 - 在您的第一个示例中 - 第一个块并忽略后面的块,并且 - 在您的第二个示例中 - 也将执行第一个块,因为条件满足而块跟随将被忽略。

因此,回顾一下,在第二个示例中,第三个if块将永远不会被执行,因为它的执行条件由第一个and if组成阻止条件。为了执行第三个块,您需要一个第一个if块的条件(让我们说c1)和第二个if块& #39; s条件(让我们说c2)是falsec1 && c2true,但为了c1 && c2到{{} 1}}您需要truec1c2,这会导致执行第一个块并跳过其余块。