我正在使用PHP的较低版本v4.3和v5.3 测试代码,这是一些代码在没有分号后继续。它的作品和奇怪的输出。
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
//Output: 2 its strange
但echo
引发错误Parse error: syntax error, unexpected 'echo' (T_ECHO)
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
echo "$i\n";
}
//Output: Parse error: syntax error, unexpected 'echo' (T_ECHO)
答案 0 :(得分:5)
continue <foo>;
语句接受一个参数,因此您可以在其后添加更多表达式:
print
continue print();
是一个表达式,可以用作其他语句的一部分,因此2
是有效的语法。这也是输出continue print $i;
的原因,$i == 2
时正在执行单个语句echo
。
<anything> echo
是一个语句,不可以用作其他表达式的一部分,import math
def factint(n):
pos_n = abs(n)
max_candidate = int(math.sqrt(pos_n))
for candidate in xrange(max_candidate, 0, -1):
if pos_n % candidate == 0:
break
return candidate, n / candidate
是无效的语法。
答案 1 :(得分:4)
原因是continue语句接受一个可选的整数(要继续的循环数),如果没有给出,则默认为1。
如果没有分号,PHP会将下一个表达式作为整数。语言构造print
返回一个整数,所以没关系。但是,echo
也是一种语言构造,但它没有返回值。因此,当解析器正在寻找一个整数时,它会碰到一个没有返回值的语言结构,并且会混淆并引发错误。
真正的解决方案是输入分号,因为没有分号,你实际上可能会改变continue
的行为。
(在这种情况下你不是,因为print 总是返回一个,但在其他情况下,它实际上可能会在你的代码中引入错误。)
答案 2 :(得分:1)
非常确定这是因为,在早期版本的php中,你可以做到
Non-Renewing
然后它将继续f()返回的循环数(在这种情况下,$ i循环。如果它返回1,它将继续$ ii循环) 在现代版本的PHP中,您可以对数字进行硬编码,但不能继续使用变量编号,必须在编译时决定。和print()返回int。 echo不会,这就是为什么你得到一个错误,继续的参数必须是一个int。
答案 3 :(得分:0)
原因:输出:2
因为整个继续打印&#34; $ i \ n&#34 ;;被评估为单一 表达式,因此仅当$ i == 2为真时才调用print。 (该 print的返回值被传递以继续作为数字参数。)