用于分组的圆括号是否算作运算符?

问题描述 投票:4回答:3

在C中,圆括号用于制作函数调用和类型转换等更多内容。

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

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

许多人说他们是,很多人说不......

c operators language-lawyer
3个回答
3
投票

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标准似乎将它们视为运算符。


2
投票

分组括号不是运算符,它们更像是元运算符 - 这会影响应用其他运算符的结果,而不是运算符本身。在类似的意义上,花括号本身不是语句,但它们会影响其他语句的组合。

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

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


1
投票

我很确定,不应将分组括号视为运算符。

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

让我们从运营商的定义开始(强调我的未来):

C111 6.4.6 Punctuators2

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

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

C11 6.5.1/5 Primary expressions

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

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

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

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


1)根据publicly available N1570草案版本。

2)相关引用与C90基本相同,但它位于6.1.5运算符子条款中,不再存在。

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

© www.soinside.com 2019 - 2024. All rights reserved.