Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Интересно, что тернарный оператор в PHP имеет приоритет ниже операторов присваивания. То есть конструкция вида
a = test()? b = c: d = e;
$a = 'old a';
$b = 'old b';
$c = 'old c';
$a = true ? $b = 'new b' : $c = 'new c';
$a = false ? $b = 'new b' : $c = 'new c';
$a = true ? $b = 'new b' : $c = 'new c';$a = ) Сначала вычисляются присваивания в каждом узле тернарного оператора, и лишь затем возвращается значение тернарного оператора. По такой логике приоритет присваивания выше. Или я неправ?Сначала вычисляются присваивания в каждом узле тернарного оператора
expression ::= multiplication ('+' | '-' multiplication)*
multiplication ::= operand ('*' | '/' operand)*
operand ::= NUMBER | '(' expression ')'
Выражения вычисляются не в каждому узле тернарного оператора, а только в том узле после знака "?", который должен быть возвращён как результат тернарного оператора. Другой узел не вычисляется.
Боюсь, вы не совсем правильно себе представляете смысл приоритета в терминах разбора выражения. В парсере нет такой логики «найди оператор X и выполни его, а затем найди оператор Y..»
Но имхо, это срабатывает оптимизатор, поэтому это не аргумент за или против приоритетов операций.
var a = 3;
var b = true ? a = 1 : 2;
console.log(a); // 1
console.log(b); // 1
Expression = AssignExpr
AssignExpr = T_IDENT '=' AssignExpr | TernaryExpr
TernaryExpr = Expression ? Expression : Expression
> отличается от остальных C-style языков.
Это Java и C/C++/Obj-C?
Ибо в JavaScript поведение аналогично
То есть внутри тернарного оператора приоритет начинается исчисляться заново, и на сам оператор уже никак не опирается.
<?php
$a = $b > 1 ? $c AND $d : $e AND $f;
Отсутствие формальной спецификации языка
php-5.4.0.tar.gz\php-5.4.0\Zend\zend_language_parser.y не подойдет?
Разработка парсера PHP средствами ANTLR