#c
Вопрос:
Я изучаю программирование на Си в университете, и для викторины пришел вопрос выше. Я хотел бы понять, как это будет выполняться. Имеет ли это какое-то отношение к порядку приоритета?
Комментарии:
1. ИМХО, это бесполезный вопрос и бесполезный ответ, который нужно знать. Позвольте мне объяснить. Вы никогда не должны писать такой код, даже если вы его понимаете. Это слишком запутанно и запутанно без всякой причины или выгоды. По тем же причинам этот код в идеале не должен существовать. Хорошо, но что делать, если вы столкнетесь с этим кодом, ведь мир не идеален. В этих случаях все, что вам нужно, это знать, как прочитать таблицу приоритетов C , чтобы понять, что это значит. Это действительно навык, который вам нужно развить. Зная наизусть ответ на этот вопрос: ни в малейшей степени.
Ответ №1:
Да, это так, но это только половина истории.
Чтобы решить эту проблему, вам нужно знать две вещи:
- приоритет оператора
=
и|=
- если это одно и то же, то ассоциативность этих операторов (слева направо или справа налево)
К счастью, в cppreference есть столик.
Это говорит нам о том, что:
- оба
=
и|=
имеют одинаковый приоритет - их ассоциативность-справа налево
Таким образом , ответ на тест (как показано на вашем скриншоте!) таков a = (b |= c)
, то есть
b |= c
сначала оценивается, а затем добавляется результат a
.
Но, как указывает болов, любой уважающий себя программист, как минимум, заключил бы вас в скобки или (в идеале) закодировал бы это как два отдельных оператора.
Комментарии:
1. «приоритет» относится к ассоциативности операторов, а не к порядку операций. Приоритет означает, что операндами
=
являютсяa
и(b |= c)
. Нет необходимостиb |= c
запускать первым; операнды операторов присваивания не упорядочены . Компилятор может обновитьa
перед обновлениемb
; и три выраженияa
,b
, иc
могут быть вычислены в любом порядке.2. @M. M Нет, ассоциативность относится к ассоциативности, а приоритет относится к порядку операций. Посмотрите на таблицу, связанную в этом ответе: в ней указаны как уровни приоритета, так и ассоциативность. Для любых двух операций в одном и том же выражении сначала выполняется операция с меньшим значением в столбце приоритет.
a amp; b ^ c
сначала будет проведена оценкаa amp; b
, а затем результат с^ c
помощью «потомуamp;
^
что» будет указан в таблице раньше.3. @Caleb Ваш комментарий совершенно неверен, извините
4. @M. M Требуется цитирование. Вот один из них, который поддерживает мою точку зрения: в математике и компьютерном программировании порядок операций (или приоритет операторов) представляет собой набор правил, которые отражают соглашения о том, какие процедуры следует выполнять в первую очередь для оценки данного математического выражения. В качестве альтернативы приведите пример, в котором оператор с более низким приоритетом оценивается перед оператором с более высоким приоритетом.
5. @M. M См. Также Kamp;R, 2-е изд., стр. 52: «В таблице 2-1 обобщены правила приоритета и ассоциативности всех операторов…строки расположены в порядке убывания приоритета…»
Ответ №2:
Когда формулы расчета имеют одинаковый приоритет.
Это будет решено с правой стороны.
Другими словами, результат совпадает со следующей формулой.
b=b|c;
a=a b;