【问题标题】:Are round parentheses used for grouping considered an operator?用于分组的圆括号是否被视为运算符?
【发布时间】:2023-03-19 12:40:01
【问题描述】:

在 C 中,圆括号用于进行更多的操作,例如函数调用和类型转换。

但是它们也被用来对许多子表达式进行分组以进行更改 运算符的顺序评估。

我的疑问是:当用作分组运算符时,它们是否被视为运算符?

很多人说是,很多人说不......

【问题讨论】:

  • 只有在可能的情况下我才会说是 2(7) 给 14... 否则,不会。
  • @JoeDF 为什么?这完全无关紧要。我们在这里讨论的不是乘法而是括号。
  • 我知道,但是如果它们可以用于乘法,那么它们可以被视为运算符。显然,事实并非如此。
  • 他们被认为是运营商,无论如何......:P

标签: c operators language-lawyer


【解决方案1】:

我相当肯定,分组括号不应被视为运算符。

请注意,脚注不是标准的一部分(即它们不是规范性的,或者换句话说只是提供信息)。

让我们从运算符的定义开始(重点是我的未来):

C111 6.4.6 标点符号2

标点符号是具有独立句法和语义的符号 意义。根据上下文,它可以指定要执行的操作 执行(这反过来可能会产生一个值或函数指示符, 产生副作用,或其某种组合)在这种情况下,它 被称为运算符(其他形式的运算符也存在于某些 上下文3)。 操作数是操作员作用的实体。

接下来,我们来看看括号表达式的定义:

C11 6.5.1/5 基本表达式

带括号的表达式是主表达式。它的类型和价值 与未加括号的表达式相同。它是一个 左值,函数指示符,或 void 表达式,如果 不带括号的表达式分别是一个左值、一个函数 指示符或空表达式。

void 表达式不产生值或函数指示符。它的评估可能会产生副作用,但它没有义务这样做,如下面的 (void expr) 示例:

((void) 5); // here, no side effects are produced

在我看来,以上证明(通过矛盾),分组括号不是运算符。在这种情况下,() 只是终端,用于表示带括号的表达式。


1)根据publicly availableN1570草稿版。

2) 相关引用与 C90 中的引用基本相同,尽管它位于 6.1.5 Operators 子条款中,但已不再存在。

3) 这句话是在 C99 中添加的。我相信它的意图是反映新的_Pragma 运营商。

【讨论】:

    【解决方案2】:

    6.5 表达式章节 (N1570) 第 3 段

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

    有以下注释:

    85) 语法指定表达式求值中运算符的优先级,与此相同 作为本小节主要小节的顺序,最高优先级在前。因此,例如, 允许作为二元 + 运算符 (6.5.6) 的操作数的表达式是定义在 6.5.1 至 6.5.6。例外是强制转换表达式 (6.5.4) 作为一元运算符的操作数 (6.5.3),以及包含在任何以下运算符对之间的操作数:分组 括号 () (6.5.1)、下标括号 [] (6.5.2.1)、函数调用括号 () (6.5.2.2) 和 条件运算符 ?: (6.5.15)。

    因此,C 标准似乎将它们视为运算符。

    【讨论】:

      【解决方案3】:

      分组括号不是真正的运算符,它们更像是元运算符 - 影响应用其他运算符的结果的东西,而不是运算符本身。类似地,花括号本身并不是语句,但它们会影响其他语句的组合。

      将圆括号视为元运算符的一个原因是,在解析表达式时,分组括号通常从解析器生成的表达式树中消失*

      * 这并不意味着所有解析器都删除括号 - 在某些情况下必须保留它们。例如,在代码格式化工具中,必须保留所有标记,包括 cmets 和空格。但是,当解析表达式以进行评估时,不会直接保留分组括号。

      【讨论】:

      • 您的回复引入了一个有趣的观点,但标准似乎另有规定。了解标准的运算符是什么会很有趣...
      • @xdevel2000 我有理由确定这是 C 标准委员会的一个相当不幸的措辞。 C++ 标准对 C 表达式进行了改编和扩展,但它的做法有所不同,将括号分组作为构造主要表达式的语法(第 5.1.1.6 节)。
      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多