Действительно ли троичный оператор C / C ++ имеет тот же приоритет, что и операторы присваивания?

Почти все таблицы приоритетов операторов C / C ++, с которыми я ознакомился, перечисляют троичный условный оператор как имеющий более высокий приоритет, чем операторы присваивания. Однако есть несколько таблиц, таких как википедия, и тот, в operator-precedence.com, это ставит их на один и тот же уровень приоритета. Что это выше или выше?

7

Решение

В грамматике C ++

Назначение выражение:
условно-выражение
оператор инициализации оператора логического или-выражения
вбрасывание выражение

условно-выражение:
логико-или-выражение
логическое или выражение? выражение: присваивание-выражение

инициализатор-пункт:
Назначение выражение
приготовился-INIT-лист

может быть объединен с

Назначение выражение:
логико-или-выражение
логическое или выражение? выражение: присваивание-выражение
логическое-или-выражение
оператор инициализации оператора логического или-выражения
вбрасывание выражение

Если только смотреть на = а также ?:и если игнорировать внутреннее выражение между ? а также :это явно дает ?: а также = точно такой же приоритет.

Это отличается от грамматики C, в которой ни ?:Левый и правый операнды могут иметь оператор присваивания в качестве самого верхнего оператора.

Назначение выражение:
условно-выражение
унарное выражение оператор присваивания выражение присваивания

условно-выражение:
логическое ИЛИ-выражение
логическое ИЛИ-выражение? выражение: условное выражение

Поэтому для C имеет смысл дать им разные уровни приоритета.

Тем не менее, уровни приоритета являются лишь приблизительным значением того, что на самом деле говорит стандарт. Будут случаи для любых выбранных вами уровней приоритета, которые показывают, что уровни вводят в заблуждение или просто неверны. В зависимости от вашей интерпретации, внутреннее выражение ?: может быть один из них, это для меня.

12

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

Вы найдете это в стандарте:

5 выражений [expr]

58) Приоритет операторов прямо не указан, но он может быть получен из синтаксиса. (нота)

Это означает, что таблицы приоритетов выводятся, а не указываются. Пока они ведут себя одинаково, вы можете сказать, что оба правы. Таким образом, даже если таблица приоритетов размещает их как имеющие одинаковый приоритет или размещает троичную над оператором присваивания, на практике происходит то же самое из-за синтаксиса.

Обратите внимание, что ассоциативность здесь играет большую роль (это также вытекает из синтаксиса).

Даже если вы предполагаете, что они имеют одинаковый приоритет:

a = b ? c : d;

будет рассматриваться как a = (b ? c : d) потому что они оба справа налево ассоциативный.

7

Ответ на C ++ заключается в том, что ?: а также = имеют такой же приоритет. Да, почти каждая таблица приоритетов операторов C ++ там неправильная.

В Си не имеет значения, ?: выше чем = или нет, потому что в C ?: Оператору не разрешается вычислять l-значение, что он должен был бы сделать, если бы приоритет влиял на поведение (учитывая, что они уже ассоциативны с RTL). Смотрите обсуждение под ответом Лучиана Кригора, например.

Возможно, эта ошибка настолько распространена, потому что ранние таблицы приоритетов операторов C ++ могли быть скопированы и расширены из таблиц C. И, возможно, ошибка сохранилась, потому что единственный контрпример — выражения вида a?b:c=d — редко используются. Может быть.

6
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector