C 语言最令人烦恼的解析重温
当看似无害的语句可以被解释时,C 中臭名昭著的“最令人烦恼的解析”现象就会出现作为函数声明或变量声明。这可能会导致意外的行为和难以调试的错误。
一个经典的例子是代码片段:
widget w( gadget(), doodad() );
乍一看,这似乎是一个变量声明名为 w 的小部件,带有带括号的初始值设定项。然而,经过仔细检查,我们意识到 gadget() 和 doodad() 是函数调用,使该语句成为函数声明。
之所以会出现歧义,是因为数组类型的函数参数衰减为指向其第一个元素的指针,而函数类型的函数参数会衰减为函数指针。这意味着上面函数的签名实际上是:
widget w( gadget(*)(), doodad(*)() );
换句话说,它接受两个函数指针作为参数并返回一个小部件。
当变量出现时,会出现更令人困惑的情况涉及到:
widget w(gadget(x));
由于 x 是一个变量,所以似乎不可能将其解释为函数声明。然而,C 允许在变量声明中使用额外的括号。因此,小工具 x;和小工具(x);声明相同的变量 x。
因此,上面的代码可以被解析为一个函数声明,它采用名为 x 的 gadget 类型的单个参数并返回一个小部件。这证明了理解复杂的 C 语法以避免这些微妙陷阱的重要性。
以上是为什么 C 的'最令人烦恼的解析”将变量声明误解为函数声明?的详细内容。更多信息请关注PHP中文网其他相关文章!