问题描述
我正在学习PHP。我决定采用一种解决方案来解决著名的FizzBuzz问题,从Java脚本到PHP,只是为了了解JS和PHP的比较。
对于那些忘记了FizzBuzz问题是什么的人:
写一个简短的程序,在新的程序上打印从1到100的每个数字 线。对于3的每一个倍数,请打印“ Fizz”而不是数字。 对于5的每一个倍数,请打印“ Buzz”而不是数字。对于 数字是3和5的倍数,请改用“ FizzBuzz” 的数量。
在以下示例中,我将使用很多短路评估。 这是我适应PHP的聪明解决方案(不是我写的):
太棒了!
然后,为了挑战,我决定尝试将其重写为一行。 这是我的开始方式:
似乎是一个好的开始。我在while循环中的条件:如果未设置$ i,则将其设置为零,但是如果已经设置,则跳过第一部分,并检查其是否低于100。 如您在这张图片上看到的,我的循环起作用了。 由于我的目标是在一行中编写它,因此我需要在条件语句中增加$ i,就像之前的多行解决方案一样。但是当我像以前那样写$ i ++
确实很奇怪。 甚至更奇怪,如果我同时使用两个增量(条件中一个,循环中一个),则循环可以正常工作,并应用两个增量。
我很困惑。是否因为某个地方存在无限循环的保障?通过所有这些短路评估,甚至我的IDE PHP Storm都说“变量$ i可能未定义”。但是它得到了定义,并且我的循环在某些条件下可以正常工作。我想念什么?
编辑: 这是代码: 多行工作的FizzBuzz:
$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
导致$i
为true
。true++
实际上什么也没做。true < 100
是false
。echo true
输出1。
明确的true + 1
创建2。
如果未设置$ i,则将其设置为零
这不太正确。这是怎么回事。
- 您的语句
($i=0 || true)
将$i
设置为TRUE
。 - PHP的类型在
"$i"
上打印“ 1”。考虑使用$v = TRUE; echo "$v";
才能看到效果。 - 在下一次迭代中,您的第二个条件被评估为
TRUE < 100
,其结果为FALSE
,从而退出循环。
因此,为了解决您的问题,只需放下|| true
并按照自己的喜好行事。
过时的评论:我发现了古怪的起源。不知道为什么会这样。 如果我将$ i ++重写为($ i = $ i + 1),则可以正常工作。
while ( (!isset($i) && ($i=0 || true) ) || (($i = $i + 1) < 100) ) {
echo $i . "\n";
}
,
OMG,是的!我以为我需要 || true 部分是因为(!isset($ i)&&($ i = 0))要么做 && 的两面,要么都不做。我从未想到($ i = 0)会评估为“ true”。但看起来确实如此:)