[英]Why does this "if" condition not break the loop?
我有一个带有条件块的for
循环,可以中断循环。
但是,循环永远不会中断。
这是我的代码:
for($counter=1;$counter>5 or $counter<=100;$counter*=2){
echo $counter."<br>";
if($counter==500){
break;
}
}
因为 counter 永远不会正好是 500。它将是 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, ...
你可能想要
if($counter>=500){
break;
}
但我不能肯定,因为我不知道你在做什么。
看起来$counter
永远不会等于 500 来满足条件 if 语句。 你应该改变
if($counter==500){
break;
}
到
if($counter>500){
break;
}
因为你的中断逻辑是错误的:
循环计算 => 下一个值
1 => 1
1*2 => 2
2*2 => 4
4*2 => 8
8*2 => 16
16*2 => 32
32*2 => 64
62*2 => 128
128*2 => 256
256*2 => 512
512*2 => 1024
打破你的循环改变你的
if($counter==500){
break;
}
到
if($counter>500){
break;
}
就像其他人所说的那样, $counter
永远不会正好是 500,因为它会经历 2 的幂(1、2、4、8、16、32、64、128、256、512 等)。
解决这个问题很简单:你使用>500
而不是==500
您的for循环条件是$counter > 5 or $counter <=100
。 这涵盖了所有数字,因为所有数字要么大于 5,要么小于(或等于)100。
这意味着for循环将永远运行,因为检查将始终为真。
然后,您在每个循环之后进行手动检查,以检查$counter
是否大于 500。这可以通过稍加修改移动到条件,因为for循环在每个循环后检查条件(与您的手动检查相同)。
新条件变为“旧条件而不是手动条件”(布尔值 AND)。 由于旧条件始终为真,新条件变为TRUE & !$counter > 500
,这与$counter <= 500
。
如果我正确理解你的目标,这应该会产生你想要的。
for($counter = 8; $counter <= 500; $counter *= 2) {
echo $counter."<br>";
}
这将回显 8, 16, 32, 64, 128, 256 并退出循环,因为下一个值 512 不会 <= 500。
如果您需要从 1 开始,另一种选择是:
for($counter = 1; $counter <= 500; $counter *= 2) {
if($counter < 6 ) {
continue; // this will jump back to the start of the for loop
} else {
echo $counter."<br>";
}
}
在您的原始代码中:如果您以 $counter = 1 开始,由于 <= 100 条件,2、4、8、16、32 和 64 的值都将返回 true。 如果包含 $counter > 5 条件,则超过 5 的每个值都将为真(8、16、32、...到无穷大)。 由于计数器每次都加倍,它永远不会等于 500(它将是 64、128、256、512、1024...),因此触发中断的条件永远不会发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.