Расчет PHP - почему 1 + 1 = 3?

Код, который отправляет мой друг, это:

echo '1+1='.(1+1==2?2:1+2==2?3:2);

Почему это 3?

Ответ 1

PHP-оценка тернарного (или условного) оператора немного отличается от оценки других языков.

1+1==2 ? 2 : 1+2==2 ? 3 : 2

Большинство языков (например, JavaScript) оценили бы это как:

(1+1==2) ? (2) : ( (1+2==2) ? (3) : (2) ) 
=> 2

PHP, однако, оценивает это как:

( (1+1==2) ? (2) : (1+2==2) ) ? (3) : (2)
=> 3

Поэтому, поскольку (1+1==2) оценивает значение true, результат первого тернарного выражения оценивается как 2, и этот результат затем передается во второе тернарное выражение, которое оценивается как 3.

Такое поведение упоминается в документации:

Рекомендуется избегать тройных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении неочевидно & hellip;

В статье в Википедии об операторе ?: также упоминается следующее:

Из-за неудачной ошибки в языковой грамматике реализация?: в PHP используется некорректная ассоциативность по сравнению с другими языками & hellip;

Причина в том, что вложение двух условных операторов приводит к возникновению негабаритного состояния с двумя последними параметрами в виде его ветвей: c1 ? o1 : c2 ? o2 : o3 действительно ((c1 ? o1 : c2) ? o2 : o3). Это признано и, вероятно, не изменится.