【问题标题】:() operator in CC 中的 () 运算符
【发布时间】:2014-01-08 23:42:44
【问题描述】:

我知道 C 中的“()”运算符既可以作为括号运算符,也可以作为函数运算符,我的问题是它什么时候会表现为括号,什么时候会表现为函数?比如下面的代码sn -p

float (*ptr)(int)

我们可以这样理解上面的内容,ptr 是一个指向函数的指针,它接受一个 int 作为参数并返回一个浮点数。我的问题是 C 怎么知道以这种方式解释它?

另外,这种说法是否合法:

(*ptr)int --> 我认为 ptr 是一个指向 int 变量的指针

【问题讨论】:

  • 它怎么知道如何解释它?因为没有其他方法是有意义的。换句话说,就是语法规定的。
  • 您的困惑可能在于您将() 称为操作员。我认为这不是准确的术语。括号只是 C 中的语法。
  • operator() 存在于 C++ 中,但它是不同的东西。如果您只想回答 C,请删除 C++ 标签
  • C 没有 C++ 的operator 关键字,但将() 函数调用语法视为一个操作符,它接受一个指向-函数操作数和零个或多个作为参数传递的附加操作数。在 ISO C 标准中,函数调用语法在第 6.5.2 节“后缀运算符”中定义。
  • @AyBayBay:别担心。你的问题很好。它甚至得到了赞成票。我们都只是顽固的老脾气;忍受我们。

标签: c pointers operators


【解决方案1】:

括号和逗号一样,在 C 语法中以多种不同的方式使用:函数调用、表达式分组、声明分组、强制转换运算符、ifforwhiledo-while 的分隔符语句、类似函数的宏定义和调用的分隔符,可能还有一些我没有想到的其他内容。

函数调用语法是否真的是一个操作符并不完全清楚。如果是,它需要一个指向函数类型的操作数,以及零个或多个作为参数传递的操作数。函数调用在 ISO C 标准的第 6.5.2 节中进行了描述,标题为“后缀运算符”,但有些人更愿意将函数调用视为一种不同于 +* 等运算符的构造。

至于如何将这种用法与其他用法区分开来,其想法是语言语法(几乎)明确。有一个与函数调用匹配的特定语法产生

postfix-expression:
    primary-expression
    postfix-expression [ expression ]
    postfix-expression ( argument-expression-list[opt] )
    [several more lines omitted]

当编译器的解析器处理一个 C 源文件时,如果它匹配将 postfix-expression (argument-expression-listopt) 定义为 的产生式postfix-expression,它识别一个函数调用。括号的其他用途(例如在强制转换运算符中)与该产生式不匹配,因此不会被视为函数调用。

N1570 是 ISO C 标准的最新草案。

【讨论】:

  • There's a specific grammatical production -- 你可以在 C 规范中找到它。或者,您只需记住所有内容的去向即可。
  • @Keith Thompson 你说“语言语法是明确的”是错误的。在特殊部分中解释了一些模棱两可的结构。例如,对于 C++ 来说就是这样。
  • @VladfromMoscow:黄鼠狼措辞添加:“(几乎)明确”。但是您指的是什么特殊部分(在 C 标准中)?
  • @VladfromMoscow:Typedef 确实创建了必须通过引用符号表来解析标识符的句法类别的情况(typedef 几乎创建了一个新的并且可能是临时的关键字)。你指的是这个吗?
  • @ Keith Thompson 我的意思是 C++ 标准中的“6.8 歧义解决”部分。
【解决方案2】:

与任何其他编程语言一样,C 有自己的语法,它可以根据它分析源代码并生成正确的结构。

至于表达或声明

(*ptr)int;

那么它是不正确的。正确的声明将是

int (*ptr);

这里的 int 是一个简单的类型说明符, ( *ptr ) 是一个声明符。

【讨论】:

  • 这是有道理的,指针变量的左侧应该始终具有数据类型,指示它指向的数据类型,或者在函数的情况下,该函数的返回类型
  • @AyBayBay 你可以在ISO官方网站下载包含语言本身描述和语法的C标准草案..
【解决方案3】:

与K&R的第53页相同。 () [] -> 具有最高优先级。这意味着 () 或 [] 或使用 -> 中的项目具有最高优先级。这并不意味着存在 () 或 [] 运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2023-03-18
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多