我只是想出了如何测试某些条件并修改循环内的输出。但是我注意到,使用&&
运算符测试两个条件只能在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);
}
答案 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
成功执行,其余ifs
和else-ifs
将被忽略。
然而,在代码1中,ifs
和else-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)
让我们使用数字6
,10
,15
作为示例。
数字6
将在您的第一个示例(工作示例)中执行 - 第二个if
块,因为在第一个中,第三个和第四个块将不满足条件忽略,并且 - 在你的第二个例子(不工作的例子)中 - 将执行第一个if
块并忽略后面的其他块。
数字10
将会执行 - 在您的第一个示例中 - 第三个块,因为第一个块和第二个块不满足,而第四个块将被忽略,并且 - 在您的第二个例子 - 将执行第二个块,因为不满足第一个块中的条件,而后面的块将被忽略。
数字15
将执行 - 在您的第一个示例中 - 第一个块并忽略后面的块,并且 - 在您的第二个示例中 - 也将执行第一个块,因为条件满足而块跟随将被忽略。
因此,回顾一下,在第二个示例中,第三个if
块将永远不会被执行,因为它的执行条件由第一个and
if
组成阻止条件。为了执行第三个块,您需要一个第一个if
块的条件(让我们说c1
)和第二个if
块& #39; s条件(让我们说c2
)是false
而c1 && c2
是true
,但为了c1 && c2
到{{} 1}}您需要true
和c1
为c2
,这会导致执行第一个块并跳过其余块。