echo "1" . (print '2') + 3;
返回214。脚本如何以*14结尾?
进行时
echo "1" . (print '2') + 3;
PHP将做(演示)
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
大写:
- 打印2,返回1
- concat"1",返回1=>"11"
- 添加"11"+3=>14
- 回声14
这是214。
运算符+ - .
具有相等的运算符优先级,但保持关联:
对于同等优先级的运算符,左结合性表示求值从左向右进行,右结合性表示相反。
编辑:由于所有其他答案都声称PHP做了1+3,下面是它没有做的进一步证明:
echo "1" . (print '2') + 9;
给出220,例如11+9而不是1 . (1+9)
。如果加法优先于串联,则应该是2110,但为此您必须编写
echo "1" . ((print '2') + 9);
echo "1" . (print '2') + 3;
你需要按照逻辑顺序来思考,首先发生的是什么。
在我们可以回应任何东西之前,-"1"。(打印'2')+3-我们需要评估它来解决它。
首先,我们在一张纸片上写下1,作为计算的第一部分。
Scrap paper: 1
Answer Sheet:
我们计算"打印‘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
我希望这是有意义的,记住print的返回总是1,并且任何在另一个执行中打印或回显的函数都会在调用方/父函数之前回显/打印。
中间的1实际上是一个true
语句。因为print
语句实际上返回了一个true
。因此,您可以得到2(来自打印)、1(来自回声打印)和4(来自1+3)
print
由于括号的原因首先执行,因此它首先打印2
,但返回1。然后,执行您的echo,打印1
。然后将print
的结果(即1)与3相加,即4。
print
总是根据以下条件返回1:http://php.net/manual/en/function.print.php
所以,因为算术运算符在级联时优先于算术运算符,所以您得到:
"1" . (1+3)
即"14";)。因为print
直接将字符串发送到输出,所以在所有内容前面都有"2"。。。。