将回声和打印组合在一个语句中


Combine an echo and a print in one statement

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"。。。。