【发布时间】:2018-11-20 13:28:37
【问题描述】:
我正在考虑以下之间的区别:
void *signal(int, void (*)(int))(int)
和
void (*signal(int, void (*)(int)))(int)
我知道后者来自here - Example #3: The ``Ultimate''(当我尝试大声说出来理解它时,这是一次有趣的学习经历):
signal是一个以(int, void (*)(int))为输入的函数,并返回指向另一个以(int)为参数并返回void的函数的指针。
对于前者,我认为自从最后一个 (int) 将具有比 * 更高的优先级,所以它应该是一个语法错误,但从 cdecl.org 开始,结果是:
["] 将信号声明为函数 (int, 指向函数的指针 (int) 返回 void) 返回函数 (int) 返回指向 void 的指针 [."]
所以我需要一张支票。
【问题讨论】:
-
问题是什么?
-
@Lundin: 是的,我的问题是我使用像 precedence order 这样的技术来理解这种定义,在前一个我认为最后一个
(int)会在第一个*之前先关联,这将导致语法错误。如果您想知道,您会看到我对@Michael Kenzel 的回答的评论。 -
这与运算符优先级完全无关。如果您想在阅读晦涩的内容时获得一些帮助,请查看:c-faq.com/decl/spiral.anderson.html
-
@Lundin:你说得对,但这是我在问题中提供的链接,我阅读了这些描述,但我从聊天室中的某个人那里得到了链接,他说这不是一种正式的技术。跨度>
-
@Lundin:好的,抱歉我的错误,我从
int *a[2][2]之类的示例中得出结论,首先是右关联,然后将剩余的int *作为数组中的元素类型处理。然后我认为这也适用于给定标识符之后的括号()。
标签: c function-pointers