我知道 C 中的“()”运算符既可以充当括号运算符,也可以充当函数运算符,我的问题是它什么时候会充当括号,什么时候会充当函数?例如,在下面的代码片段中
float (*ptr)(int)
我们可以这样理解上面的内容,ptr 是一个指向函数的指针,该函数接受 int 作为参数并返回 float。我的问题是 C 如何知道以这种方式解释它?
此外,此声明是否合法:
(*ptr)int
--> 我将其理解为 ptr 是指向 int 变量的指针
最佳答案
括号与逗号一样,在 C 语法中以多种不同的方式使用:函数调用、表达式分组、声明分组、强制转换运算符、if
的分隔符, for
, while
,和do-while
语句、类似函数的宏定义和调用的分隔符,可能还有一些我没有想到的其他内容。
尚不完全清楚函数调用语法是否真的是一个运算符。如果是,则它需要一个函数指针类型的操作数,以及零个或多个作为参数传递的操作数。函数调用在 ISO C 标准的第 6.5.2 节中进行了描述,标题为“后缀运算符”,但有些人更愿意将函数调用视为与 +
等运算符不同的构造。和*
.
至于如何将该用法与其他用法区分开来,其想法是语言语法(几乎)明确。有一个与函数调用相匹配的特定语法产生式:
postfix-expression:
primary-expression
postfix-expression [ expression ]
postfix-expression ( argument-expression-list[opt] )
[several more lines omitted]
当编译器的解析器处理 C 源文件时,如果它与将后缀表达式 ( argument-expression-listopt ) 定义为 的产生式相匹配,后缀表达式,它识别函数调用。括号的其他用途(例如在强制转换运算符中)将与该产生式不匹配,因此不会被视为函数调用。
N1570是 ISO C 标准的最新草案。
关于c - C 中的 () 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008952/