我有一个for
循环,其中有一个条件块会破坏循环。
但是,循环永不中断。
这是我的代码:
for($counter=1;$counter>5 or $counter<=100;$counter*=2){
echo $counter."<br>";
if($counter==500){
break;
}
}
答案 0 :(得分:2)
因为计数器永远不会恰好是500。它将是1、2、4、8、16、32、64、128、256、512,...
您可能想要
if($counter>=500){
break;
}
但是我不确定,因为我不知道你在做什么。
答案 1 :(得分:2)
看起来$counter
永远不会等于500,以满足条件if语句。你应该改变
if($counter==500){
break;
}
到
if($counter>500){
break;
}
答案 2 :(得分:1)
因为您的中断逻辑是错误的:
循环计算=>下一个值
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;
}
答案 3 :(得分:1)
就像其他人所说的那样,$counter
永远不会恰好是500,因为它经历了2(1、2、4、8、16、32、64、128、256、512等)的幂
解决方法很简单:您使用>500
而不是==500
您的 for 循环条件为$counter > 5 or $counter <=100
。这涵盖了所有数字,因为所有数字都大于5或小于(或等于)100。
这意味着 for 循环将永远运行,因为检查始终为true。
然后在每个循环之后进行一次手动检查,以检查$counter
是否大于500。由于 for 循环在每次循环后都会检查条件,因此可以向上移动该条件循环(与您的手动检查相同)。
新条件变为“旧条件和手动条件”(布尔AND)。由于旧条件始终为真,因此新条件变为TRUE & $counter > 500
,与$counter > 500
相同。
答案 4 :(得分:0)
如果我正确理解了您的目标,这应该会产生您想要的。
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的每个值都将为true(8、16、32 ... ...为无穷大)。 由于计数器每次都会加倍,因此它永远不会等于500(它将是64、128、256、512、1024 ...),因此触发中断的条件将永远不会发生。