括号是否始终被视为函数调用?

klu*_*utt 4 c operator-precedence

我正在看此页面:https : //en.cppreference.com/w/c/language/operator_precedence

引起我注意的是,括号运算符的唯一描述是函数调用。这是否意味着该表达式x = a * (b+c)-(d*e)具有两个函数调用?

我搜索了C语法C标准,但找不到任何支持或矛盾的内容。

dbu*_*ush 6

括号可以用作函数调用运算符,但这并不是它们唯一的用途。如您的示例一样,它们也用于表达式分组。

您正在寻找的是C标准的 6.5.1节,其中讨论了主表达式:

句法

1个

primary-expression:
  identifier
  constant
  string-literal
  ( expression )
  generic-selection
Run Code Online (Sandbox Code Playgroud)

...

5带 括号的表达式是主要表达式。 它的类型和值与非括号表达式相同。如果未加括号的表达式分别是一个左值,一个函数标记或一个空表达式,则它是一个左值,一个函数标记或一个空表达式。

如上所述,括号可用于对表达式进行分组。

在6.5.2节“后缀表达式”中详细介绍了用作函数调用运算符的方法:

postfix-expression:
  ...
  postfix-expression(argument-expression-list opt)
  ...
Run Code Online (Sandbox Code Playgroud)

因此,在您的表情中:

x = a * (b+c)-(d*e)
Run Code Online (Sandbox Code Playgroud)

此处使用括号匹配主表达式,但不匹配后缀表达式。

此外,除了表达式分组外,在语言语法的其他部分也使用了括号。关于选择语句的第6.8.4节在ifswitch语句的语法中使用括号:

  • if(表达式语句
  • if(表达式语句 else 语句
  • switch(表达式语句

关于迭代语句的第6.8.5节在whilefor语句的语法中也使用括号。

  • while(表达式语句
  • 在(expression)时做陈述 ;
  • for(表达式opt ; 表达式opt ; 表达式opt语句
  • for(声明 expression opt ; expression opt语句