PHP循环增量怪癖-在一行FizzBu​​zz中

问题描述

我正在学习PHP。我决定采用一种解决方案来解决著名的FizzBu​​zz问题,从Java脚本到PHP,只是为了了解JS和PHP的比较。

对于那些忘记了FizzBu​​zz问题是什么的人:

一个简短的程序,在新的程序上打印从1到100的每个数字 线。对于3的每一个倍数,请打印“ Fizz”而不是数字。 对于5的每一个倍数,请打印“ Buzz”而不是数字。对于 数字是3和5的倍数,请改用“ FizzBu​​zz” 的数量

在以下示例中,我将使用很多短路评估。 这是我适应PHP的聪明解决方案(不是我写的):

enter image description here

太棒了!

然后,为了挑战,我决定尝试将其重写为一行。 这是我的开始方式:

enter image description here

似乎是一个好的开始。我在while循环中的条件:如果未设置$ i,则将其设置为零,但是如果已经设置,则跳过第一部分,并检查其是否低于100。 如您在这图片上看到的,我的循环起作用了。 由于我的目标是在一行中编写它,因此我需要在条件语句中增加$ i,就像之前的多行解决方案一样。但是当我像以前那样写$ i ++

enter image description here

确实很奇怪。 甚至更奇怪,如果我同时使用两个增量(条件中一个,循环中一个),则循环可以正常工作,并应用两个增量。

enter image description here

我很困惑。是否因为某个地方存在无限循环的保障?通过所有这些短路评估,甚至我的IDE PHP Storm都说“变量$ i可能未定义”。但是它得到了定义,并且我的循环在某些条件下可以正常工作。我想念什么?

编辑: 这是代码: 多行工作的FizzBu​​zz:

$i = 0;
while ($i++ < 100) {
    $msg = '';
    ($i % 3) || ($msg = $msg . 'Fizz');
    ($i % 5) || ($msg = $msg . 'Buzz');
    echo $msg . "\n";
}

怪异的循环迭代(您可以在循环中或在条件中删除增量,或者将两者都删除以查看不同的效果):

while ( (!isset($i) && ($i=0 || true) ) || ($i++ < 100) ) {
    echo $i . "\n";
    $i = $i +1;
}

解决方法

$i=0 || true导致$itrue
true++实际上什么也没做。
true < 100false
echo true输出1。
明确的true + 1创建2。

,

如果未设置$ i,则将其设置为零

这不太正确。这是怎么回事。

  1. 您的语句($i=0 || true)$i设置为TRUE
  2. PHP的类型在"$i"上打印“ 1”。考虑使用$v = TRUE; echo "$v";才能看到效果。
  3. 在下一次迭代中,您的第二个条件被评估为TRUE < 100,其结果为FALSE,从而退出循环。

因此,为了解决您的问题,只需放下|| true并按照自己的喜好行事。

,

过时的评论:我发现了古怪的起源。不知道为什么会这样。 如果我将$ i ++重写为($ i = $ i + 1),则可以正常工作。

while ( (!isset($i) && ($i=0 || true) ) || (($i = $i + 1) < 100) ) {
    echo $i . "\n";
}

enter image description here

,

OMG,是的!我以为我需要 || true 部分是因为(!isset($ i)&&($ i = 0))要么做 && 的两面,要么都不做。我从未想到($ i = 0)会评估为“ true”。但看起来确实如此:)