Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP循环增量怪癖-(一行中的嘶嘶声)_Php_Loops_Increment_Fizzbuzz - Fatal编程技术网

PHP循环增量怪癖-(一行中的嘶嘶声)

PHP循环增量怪癖-(一行中的嘶嘶声),php,loops,increment,fizzbuzz,Php,Loops,Increment,Fizzbuzz,我正在学习PHP。我决定将著名的FizzBuzz问题的解决方案从Javascript改为PHP,只是为了看看JS和PHP的比较 对于那些忘记了起泡问题是什么的人: 编写一个简短的程序,在新的打印机上打印从1到100的每个数字 线对于3的每一个倍数,打印Fizz而不是数字。 对于5的每一个倍数,打印Buzz而不是数字。对于 如果数字是3和5的倍数,则打印FizzBuzz 这个数字是多少 在以下示例中,我使用了大量短路评估。 下面是一个聪明的解决方案,不是我自己写的,我已经适应了PHP: 很好 然后

我正在学习PHP。我决定将著名的FizzBuzz问题的解决方案从Javascript改为PHP,只是为了看看JS和PHP的比较

对于那些忘记了起泡问题是什么的人:

编写一个简短的程序,在新的打印机上打印从1到100的每个数字 线对于3的每一个倍数,打印Fizz而不是数字。 对于5的每一个倍数,打印Buzz而不是数字。对于 如果数字是3和5的倍数,则打印FizzBuzz 这个数字是多少

在以下示例中,我使用了大量短路评估。 下面是一个聪明的解决方案,不是我自己写的,我已经适应了PHP:

很好

然后,为了挑战,我决定尝试在一行中重写它。 我是这样开始的:

看起来是个好的开始。while循环中的条件:如果$i未设置,则将其设置为零,但如果已设置,则跳过第一部分并检查其是否低于100。 正如你在这张照片上看到的,我的循环工作正常。 因为我的目标是在一行中编写,所以我需要在条件语句中增加$I,就像我以前的多行解决方案一样。但是当我像以前一样写$I++<100时,奇怪的事情发生了。我的循环只运行一次并停止

真的很奇怪。 更奇怪的是,如果我同时使用两个增量,一个在条件中,一个在循环中,那么循环工作正常,并应用两个增量

我很困惑。是不是因为在某个地方有一个无限循环的保护?对于所有这些短路评估,即使是我的IDE PHP Storm也会说“变量$i可能未定义”。但是它得到了定义,并且我的循环在某些条件下运行良好。我错过了什么

编辑: 代码如下: 多线工作嘶嘶声:

$i=0; 而$i++<100{ $msg=; $i%3 | |$msg=$msg.‘嘶嘶’; $i%5 | |$msg=$msg.'Buzz'; echo$msg。\n; } 奇怪的循环迭代您可以删除循环中或条件中的增量,或将两者保留以查看不同的效果:

虽然isset$i&&$i=0 | | | | | |$i++<100{ echo$i。\n; $i=$i+1; } $i=0 | | true导致$i为true。 true++实际上什么都不做。 真<100等于假。 回显真输出1。 显式true+1创建2。

$i=0 | | true导致$i为true。 true++实际上什么都不做。 真<100等于假。 回显真输出1。 显式true+1创建2

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

这是不对的。事情是这样的

您的语句$i=0 | | true将$i设置为true。 PHP的类型与print 1的转换为$i。考虑$V=真;echo$v;看到这一点的效果。 在下一次迭代中,第二个条件的计算结果为TRUE<100,该值为FALSE,从而退出循环。 所以,为了解决你的问题,只需放下| |真,走上你的快乐之路

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

这是不对的。事情是这样的

您的语句$i=0 | | true将$i设置为true。 PHP的类型与print 1的转换为$i。考虑$V=真;echo$v;看到这一点的效果。 在下一次迭代中,第二个条件的计算结果为TRUE<100,该值为FALSE,从而退出循环。
因此,为了解决您的问题,只需放弃| | true,继续快乐的生活。

过时的评论:我找到了怪癖的根源。不知道为什么会这样。 如果我将$I++重写为$I=$I+1,它就可以正常工作

虽然isset$i&&$i=0 | | | | | |$i=$i+1<100{ echo$i。\n; }
过时的评论:我找到了怪癖的根源。不知道为什么会这样。 如果我将$I++重写为$I=$I+1,它就可以正常工作

虽然isset$i&&$i=0 | | | | | |$i=$i+1<100{ echo$i。\n; }
天哪,是的!我想我需要真实的部分,因为!isset$i&&$i=0将执行&&&的两侧,或者两者都不执行。我从没想过$I=0的计算结果会是真的。但看起来确实如此:

天哪,是的!我想我需要真实的部分,因为!isset$i&&$i=0将执行&&&的两侧,或者两者都不执行。我从没想过$I=0的计算结果会是真的。但它看起来是这样的:

请始终以文本形式发布代码,而不是以屏幕截图形式发布。“某个地方有无限循环的保护措施”-当然不是。请始终以文本形式发布代码,而不是以屏幕截图形式发布代码。“某个地方有无限循环的保护措施”-当然不是。对PHP类型的杂耍来说是的。很适合PHP类型的杂耍。你可以参考我们的答案来解释。$i=$i+1起作用的原因同样是因为类型转换。增量运算符的文档明确说明它对布尔运算没有影响。您可以参考我们的答案以获得解释。$i=$i+1起作用的原因同样是因为类型转换。增量运算符的文档明确说明它对bool没有影响 eans.$i=0计算结果为0,这是错误的。$i=0计算结果为0,这是错误的。