为什么这种“如果”条件不能打破循环?

时间:2019-07-16 19:22:27

标签: php for-loop

我有一个for循环,其中有一个条件块会破坏循环。

但是,循环永不中断。
这是我的代码:

for($counter=1;$counter>5 or $counter<=100;$counter*=2){

    echo $counter."<br>";
    if($counter==500){
      break;
    }
}

5 个答案:

答案 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 ...),因此触发中断的条件将永远不会发生。