2013-06-28 3 views
2

Какова бы правильная таблица приоритетов оператора, в которой перечислены все операторы на языке C?Таблица приоритетов оператора для языка программирования C

Я провел обширный поиск в Интернете и нашел много таких таблиц приоритета. Увы, я не нашел ни одного наполнения этих требований:

  • Списки все операторов в языке C, как это определено в ISO 9899: 2011, без смешивания в операторах любого C++.
  • Перечисляет операторы в полностью исправить приоритетный порядок.
+0

Приоритет оператора в C задается порядком, в котором различные группы операторов отображаются в стандарте (глава 6.5). Это утомительное чтение, предпочтительнее будет «таблица приоритетов», которая быстро суммирует всех операторов, в частности, в качестве справочной информации для обсуждения программ на SO. Если бы мы могли сделать такую ​​запись и использовать ее как часто задаваемые вопросы, это было бы здорово. – Lundin

+0

Возможный дубликат [Приоритет между доступом членов от указателя и литой] (http://stackoverflow.com/questions/17077628/precedence-between-member-access-from-a-pointer-and-cast) – jxh

+0

Запись в таблице с операторами «того же» приоритета следует также объяснить, что приоритет основан на правее слева направо или справа налево, поскольку они появляются в исходной строке. Таким образом, полное упорядочение того, как вы указали, невозможно, потому что для операторов с одинаковым приоритетом приоритет одного над другим - «это зависит». – jxh

ответ

4

enter image description here


Объяснение

Prec. обозначает приоритет оператора, где группа 1 имеет самый высокий приоритет, а группа 17 - самая низкая.

Доц. обозначает operator associativity, где это применимо. Ассоциативность может быть либо слева направо, либо справа налево.

Источники

Моя цель с этой должности, чтобы обеспечить преимущество стол оператора на месте на переполнение стека, который является правильным и каноническим. Эта таблица приоритетов операторов соответствует непосредственно главе 6.5 ISO 9899: 2011, где мы можем читать (6.5/3):

Группировка операторов и операндов обозначается синтаксисом. 85)

А потом как комментарий, в информативной (не обязательное) сноске:

85) Синтаксис определяет приоритет операторов в оценке выражения, которое является тем же самым как порядок основных подпунктов этого подпункта, наивысший приоритет в первую очередь./-/

В каждом главном подпункте операторы имеют одинаковый приоритет. Левая или правая ассоциативность указана в каждом подпункте синтаксисом выражений, обсуждаемых в нем.

Все официальные имена операторов из таблицы взяты из главы 6.5, где такое имя может быть найдено в нормативном тексте. Неофициальные имена были включены в случаи, когда сообщество программистов могло быть более знакомо с другим именем, чем тот, который указан в стандарте.

+0

Я надеялся сделать это сообщение в формате wiki, но мне не удалось опубликовать текстовую таблицу, которую можно редактировать другими. Любое исправление или исправление приветствуются, пожалуйста, оставьте комментарий ниже. Предпочтительно со ссылкой на стандарт. На данный момент таблица существует в текстовом формате MS Excel в виде вкладок на моем компьютере. Я могу предоставить файл, если какой-либо веб-мастер смог опубликовать HTML-версию этого на SO. Если бы таблица могла быть отредактирована всеми, это было бы здорово. – Lundin

0

Этот сайт имеет довольно большое преимущество стол:

http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

+0

Он не поддерживает C11. – Lundin

+0

@ Lundin Я не знал, что приоритет оператора изменился на C11, и я не поверил бы ему без доказательств. Итак, как вы говорите, они изменились, чтобы сделать эту таблицу недействительной? Кстати, я всегда смотрю на http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence – cmaster

+0

Я думаю, что было несколько новых операторов, добавленных в C11 ('alignof', например), поэтому я думаю, что он просто хочет знать, как они вписываются в остальные операторы. –

1

Здесь:

http://basen.oru.se/c/operators.html

(я добавил _Alignof, который я думаю, это единственный новый оператор в C11, в мой собственный стол и опубликовал его там. Может быть, это обман? Комментарии и предложения о том, как t о улучшить таблицу радушны.)

+0

Я предполагаю, что первая '()' является регулярной скобкой? Затем он будет частью категории «первичные выражения» с более высоким приоритетом, чем postfix. Или, если это вызов функции, он должен оставаться там, где он есть. В категории постфикса отсутствует оператор смешанного литерала. – Lundin

+1

Нет, первая пара скобок является оператором вызова функции. Обычные скобки для группировки подвыражений не являются оператором, поэтому они не находятся в таблице. Компонентные литералы Я вообще не предполагаю, что задействован оператор, они всего лишь часть синтаксиса, но мне нужно это проверить. –

+0

Я просто перекрестно проверил ваш стол со стандартом и прокомментировал, что я могу найти. Компонентные литералы рассматриваются как операторы, C11 6.5.2.5. – Lundin