c - C 中的 () 运算符

标签 c pointers operators

我知道 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/

相关文章:

统计小写字母,直到输入为字符串

c++ - 堆积面积计算

c - 我如何更正这个程序(结构和指针(?))?

c - 编写 C 语句,清除两位而不干扰其他位

C 程序在 if/else 之后终止,或者如果我使用 fputs/fgets 则重复

c++ - OpenMP:有人知道堆损坏的原因吗?

c++ - 如何将二维字符串数组传递给另一个类的函数

c - C中Heap实现中的BubbleUp方法

javascript - 将 "in"运算符用于带有 javascript 的二维数组

ruby - 在 Ruby 中使用 or-operator 简化 "any of"检查