Для выражения a =b|=c, как будет выполняться это выражение?

#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;