Почему длинные и короткие формы троичного оператора оценивают по-разному?

1

соответствующий вложенный тернарный оператор в php? и в каком порядке оцениваются вложенные короткие присвоения рук? объясните, что тройные операторы в PHP не оценивают, как ожидалось.

См. Этот пример:

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

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

  • 0
    Что ты не понимаешь? У вас уже есть вопрос с правильным дублированием, которое объясняет, что троичный остается ассоциативным
  • 0
    @ Rizier123, но если оба примера левоассоциативны, почему они выводят разные значения? использует внутреннюю сокращенную группу или имеет другой порядок приоритета?
Показать ещё 4 комментария
Теги:
ternary-operator

1 ответ

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
    Аааа, наконец-то я понял, что на самом деле означает «левая ассоциация». Высоко ценится, спасибо!
  • 1
    @andig Не за что. Удачного дня :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню