2015-08-27 1 views
1

corresponding nested ternary operator in php? и In which order are nested short hand assignments evaluated? объясняют, что тернарные операторы в PHP не оценивают, как ожидалось.Почему длинная и короткая формы тернарного оператора оцениваются по-разному?

Смотрите этот пример:

echo 0 ?: 1 ?: 2 ?: 3; //1 
echo 0 ? 0 : 1 ? 1 : 2 ? 2 : 3; //2 

Даже читая документы я до сих пор не в состоянии понять, почему короткие и длинные формы оцениваются по-разному?

+0

Что вы не понимаете? У вас уже есть вопрос с правильным обманом, в котором объясняется, что троянец остается ассоциативным – Rizier123

+0

@ Rizier123, но если оба примера лево-ассоциативны, почему они выводят разные значения? использует ли внутренняя группа с короткой рукой или имеет другой порядок приоритета? – billyonecan

+0

@billyonecan Потому что они разные тернарные операторы, ваши 2 строки разные – Rizier123

ответ

3

Вы уже начинаете с неправильного предположения, что эти 2 строки кода идентичны, потому что они не являются. Тернарный (expression ? IF TRUE : IF FALSE) оператор оставлен ассоциативным.

Так что, если вы пройти шаг за шагом вы, возможно, увидеть его лучше:

Первая тройная линия:

echo 0 ?: 1 ?: 2 ?: 3; //1 

С скобках:

echo ((0 ?: 1) ?: 2) ?: 3; //1 
     └──────┘     //0 → FALSE 
     ↓      //Second expression: 1 
echo ((1) ?: 2) ?: 3; //1 
    └────────┘     //1 → TRUE 
     ↓       //First expression: 1 
echo (1) ?: 3; //1 
    └──────┘     //1 → TRUE 
    ↓       //First expression: 1 
echo 1; //1 

Вторая тройная линия:

echo 0 ? 0 : 1 ? 1 : 2 ? 2 : 3; //2 

С круглыми скобками:

echo ((0 ? 0 : 1) ? 1 : 2) ? 2 : 3; //2 
     └─────────┘      //0 → FALSE 
     ↓        //Second expression: 1 
echo ((1) ? 1 : 2) ? 2 : 3; //2 
    └───────────┘      //1 → TRUE 
     ↓         //First expression: 1 
echo (1) ? 2 : 3; //2 
    └─────────┘      //1 → TRUE 
    ↓         //First expression: 2 
echo 2; //2 
+1

Ahhhh, наконец, он щелкнул со мной, что на самом деле означает «левый ассоциативный». Большое спасибо, спасибо! – andig

+1

@andig Добро пожаловать. Удачного дня :) – Rizier123

Смежные вопросы