在一个声明中结合回声和打印

时间:2012-02-09 15:39:26

标签: php syntax

echo "1" . (print '2') + 3;返回214.脚本如何以* 14结束?

5 个答案:

答案 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

用语言说:

  • 打印2,返回1
  • concat“1”,返回1 => “11”
  • 添加“11”+ 3 => 14
  • echo 14

那是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" . (1+3)

......那是“14”;)。而且因为print直接将字符串发送到输出,所以在所有内容之前得到'2'....