логический приоритет над оператором присваивания в переполнении стека

Недавно я натолкнулся на такой фрагмент:

$x = 2 && $y = 3; echo (int)$x.':'.(int)$y;

Который производит продукцию 1:3,
Глядя на оператора лист приоритета я вижу, что логические операторы || а также && имеет более высокий приоритет, чем оператор присваивания =, Таким образом, первое выражение должно быть оценено как $x = (2 && $y) = 3; который становится $x = (2 && null) = 3; и, наконец, оценивает $x = false = 3; Во-вторых, оператор присваивания имеет правильную ассоциативность, поэтому интерпретатор должен попытаться выполнить false = 3 что незаконно, конечно. Так что, по моему мнению, вышеупомянутый фрагмент кода не должен компилироваться вообще и должен выдавать синтаксический анализ или ошибку времени выполнения. Но вместо этого скрипт выдает 1: 3. Это означает, что действия, выполняемые интерпретатором:

а) $ у = 3

Би 2 && $ у

в) $ х = (2 && $ У)

Почему это так, а не в соответствии с приоритетом оператора?

3

Решение

лист приоритета оператора Вы ссылаетесь на штаты в виде отдельной заметки:

Хотя = имеет более низкий приоритет, чем большинство других операторов, PHP будет
разрешить выражения, подобные приведенным ниже: if (! $ a = foo ()), в
в этом случае возвращаемое значение foo () помещается в $ a.

Таким образом, по сути, присваивание внутри выражения будет рассматриваться как подвыражение. Как именно и когда это произойдет, не ясно из документации, в которой просто говорится, что «аналогичный«выражения будут работать таким образом.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]