echo "1" . (print '2') + 3;
返回214.脚本如何以* 14结束?
答案 0 :(得分:13)
当你这样做时
echo "1" . (print '2') + 3;
PHP会做(demo)
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2 0 > PRINT ~0 '2'
1 CONCAT ~1 '1', ~0
2 ADD ~2 ~1, 3
3 ECHO ~2
4 > RETURN 1
用语言说:
那是214。
运算符+ - .
具有相等的Operator Precedence,但是是左关联的:
对于具有相同优先级的运算符,左结合意味着评估从左到右进行,右结合意味着相反。
编辑,因为所有其他答案都声称PHP会做1 + 3,这进一步证明它没有:
echo "1" . (print '2') + 9;
给出220,例如11 + 9而不是1 . (1+9)
。如果添加优先于连接,那么它将是2110,但为此您必须编写
echo "1" . ((print '2') + 9);
答案 1 :(得分:2)
echo "1" . (print '2') + 3;
你需要按照逻辑顺序来考虑它,先发生什么。
在我们能够回应任何事情之前, - “1”。 (打印'2')+ 3 - 我们需要对其进行评估以解决它。
首先,我们在一张纸上写下1作为我们计算的第一部分。
Scrap paper: 1
Answer Sheet:
我们计算“print'2'”,它作为一个函数将数字2写入我们的答题纸,并返回1,我们在我们的废纸上写。
Scrap paper: 1 . 1 +3
Answer Sheet: 2
在此之后,由于“。”
,我们希望将下一部分连接到最后Scrap paper: 11 + 3
Answer Sheet: 2
现在我们把它放在一起
Scrap paper: 11 + 3
Scrap paper: 14
Answer Sheet: 2
然后我们将废料数据反映到我们的答题纸
答题卡:214
echo "1" . (print '2') + 3;
1.
Code--: echo "1" . (print '2') + 3;
Result:
2.
Code--: echo "1" . 1 + 3;
Result: 2
3.
Code--: echo 11 + 3;
Result: 2
4.
Code--: echo 14;
Result: 2
5.
Code--:
Result: 214
我希望这是有道理的,并且记住打印的返回总是1,并且在其他执行中打印或回显的任何函数将在它的调用者/父级之前回显/打印。
答案 2 :(得分:1)
中间的1实际上是true
语句。
因为print
语句实际上返回true
。
所以你得到2(来自印刷品),1(来自回声印刷)和4(来自1 + 3)
答案 3 :(得分:0)
print
,因此首先打印2
, but it returns 1 。然后,执行回显,打印1
。然后,您将print
(即1)的结果连接到它,并添加3。那是4。
答案 4 :(得分:0)
print
始终根据:http://php.net/manual/en/function.print.php
因此,因为算术运算符优先于一个用于连接,所以得到:
"1" . (1+3)
......那是“14”;)。而且因为print
直接将字符串发送到输出,所以在所有内容之前得到'2'....