【问题标题】:Operator precedence table for the C programming languageC 编程语言的运算符优先级表
【发布时间】:2013-06-26 11:39:27
【问题描述】:

列出 C 语言中所有运算符的正确运算符优先级表是什么样的?

我在网上进行了广泛的搜索,发现了很多这样的优先级表。唉,我还没有找到一个满足这些要求的人:

  • 列出 ISO 9899:2011 中定义的 C 语言中的 所有 运算符,不混入任何 C++ 运算符。
  • 完整和正确优先级顺序列出运算符。

【问题讨论】:

  • C 中的运算符优先级由各种运算符组在标准中出现的顺序指定(第 6.5 章)。这是一个乏味的阅读,一个快速总结所有运算符的“优先表”将是可取的,特别是作为关于 SO 的编程讨论的参考。如果我们可以发布这样的帖子并用作 C 常见问题解答,那就太好了。
  • @Lundin:实际上,运算符优先级在 C 中由语法指定。它们在标准中出现的顺序是信息性的,而不是规范性的。
  • @Lundin:这和我写的一致。
  • 运算符优先级表也不会有任何解释性文字。

标签: c operator-precedence c11


【解决方案1】:


说明

Prec. 表示运算符优先级,其中第 1 组的优先级最高,第 17 组的优先级最低。

Assoc. 表示operator associativity,如果适用。关联性可以是从左到右或从右到左。

来源

我在这篇文章中的目标是在 Stack Overflow 现场提供一个正确且规范的运算符优先级表。此运算符优先级表直接对应 ISO 9899:2011 的第 6.5 章,我们可以在其中阅读 (6.5/3):

运算符和操作数的分组由语法指示。 85)

然后作为评论,在信息性(非规范性)脚注中:

85) 语法规定了表达式求值中运算符的优先级,与本小节主要小节的顺序相同,最高优先级在前。 /--/

在每个主要子条款中,运算符具有相同的优先级。左或右结合性在每个子条款中由其中讨论的表达式的语法指示。

表中的所有正式运算符名称均取自第 6.5 章,其中可以在规范文本中找到这样的名称。在程序员社区可能比标准中给出的名称更熟悉另一个名称的情况下,包括非正式名称。

【讨论】:

  • 我希望把这篇文章做成wiki格式,但是我没有设法发布一个可以被其他人编辑的文本表。任何校对或更正都非常感谢,请在下面发表评论。最好参考标准。就目前而言,该表在我的计算机上以选项卡式文本 MS Excel 格式存在。如果某些网络向导可以设法在 SO 上发布它的 HTML 版本,我可以提供该文件。如果每个人都可以编辑表格,那就太好了。
【解决方案2】:

这里:

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

(我将我认为是C11中唯一的新运算符_Alignof添加到我自己的表中,并在那里发布。也许这是作弊?关于如何改进表的评论和建议是欢迎。)

【讨论】:

  • 我假设第一个() 是一个正则括号?然后它将成为“主要表达式”类别的一部分,优先级高于后缀。或者,如果它是一个函数调用,它应该保持在原来的位置。后缀类别缺少复合文字运算符。
  • 不,第一对括号是函数调用运算符。用于分组子表达式的正则括号不是运算符,因此它们不在表中。我认为复合文字根本不涉及运算符,它们只是语法的一部分,但我需要检查一下。
  • 我只是用标准交叉检查了您的表格,并评论了我能找到的内容。复合文字被视为运算符,C11 6.5.2.5。
【解决方案3】:

这个网站有一个非常棒的优先表:

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

【讨论】:

  • @Lundin 我不知道 C11 中运算符优先级发生了变化,如果没有证据,我不会相信。那么,你说他们改变了什么使这张表无效?顺便说一句,我总是看en.wikipedia.org/wiki/…
  • 我认为 C11 中添加了一些新的运算符(例如alignof),所以我认为他只是想知道它们如何与其他运算符相适应。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2017-06-02
  • 1970-01-01
  • 2013-08-16
  • 2021-03-29
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多