Объедините эхо и отпечаток в одном утверждении - PullRequest
3 голосов
/ 09 февраля 2012

echo "1" . (print '2') + 3; возвращает 214. Как сценарий заканчивается * 14?

Ответы [ 5 ]

13 голосов
/ 09 февраля 2012

Когда вы делаете

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

В словах:

  • print 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);
2 голосов
/ 09 февраля 2012
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

Я надеюсь, что в этом есть какой-то смысл, и помните, что возвращаемое значение print всегда равно 1, и любая функция, которая печатает или отображает эхо во время другого выполнения, будет выводить / выводить перед тем, как это сделает вызывающая сторона / родитель.

1 голос
/ 09 февраля 2012

1 между ними на самом деле является true оператором.Потому что оператор print фактически возвращает true.Таким образом, вы получаете 2 (из печати), 1 (из эхо-печати) и 4 (из 1 + 3)

0 голосов
/ 09 февраля 2012

print всегда возвращает 1 в соответствии с: http://php.net/manual/en/function.print.php

Таким образом, поскольку арифметический оператор имеет приоритет над конкатенацией, вы получаете:

"1" . (1+3)

... то есть "14";).И поскольку print отправляет строку непосредственно на вывод, вы получаете '2' перед всем ....

0 голосов
/ 09 февраля 2012

print выполняется первым из-за скобок, поэтому сначала печатается 2, , но возвращается 1 .Затем ваше эхо выполняется, печатая 1.Затем вы присоединяете к нему результат print (то есть 1) с 3 добавленными к нему.Это 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...