首页 文章

“int main(){(([[(){})());}”有效C怎么样?

提问于
浏览
250

我最近遇到了以下深奥的代码 .

int main(){(([](){})());}

按如下方式重新格式化以使其更具可读性:

int main(){
    (([](){})());   //  Um... what?!?!
}

但我无法理解 (([](){})()) 是如何有效的代码 .

  • 它看起来不像函数指针语法 .

  • 它不能是一些运算符重载技巧 . 代码按原样编译 .

谷歌对这种全符号搜索没有多大帮助 . 但它在Visual Studio 2010中编译并且不输出任何内容 . 没有错误,也没有警告 . 所以它看起来像有效的代码 .

我从未见过任何在JavascriptC function pointers之外如此奇怪的有效代码 .

有人可以解释一下这是有效的C吗?

1 回答

  • 263

    代码本质上调用一个空的lambda .

    让我们从头开始: [](){} 是一个空的lambda expression .

    然后,在C和C中,你可以将表达式包装在parens中,它们的行为完全相同†就像没有它们一样,所以's what the first pair of parens around the lambda does. We'现在在 ([](){}) .

    然后, () 在第一个包装parens之后调用(空)lambda . 我们现在在 ([](){})()

    整个表达再次包含在parens中,我们得到 (([](){})()) .

    最后, ; 结束了该声明 . 我们到达 (([](){})()); .


    †至少在C中存在一些极端情况,例如 T a_var; there's a difference between decltype(a_var) and decltype((a_var)) .

相关问题