关于如何理解printf(“%d \ n”,({int n; scanf(“%d”,&n); n * n;})); 在C中工作

我通过quora答案看到了这个程序

#include int main() { printf("%d\n", ( { int n; scanf("%d", &n); n*n; } )); return 0; } 

我想知道这是如何工作的,如果这符合标准?

此代码使用名为statement-expressions的“GNU C”function,其中括号括起的复合语句可用作表达式,其类型和值与复合语句中最后一个语句的结果相匹配。 这不是语法上有效的C,而是一个GCC特性(也被一些其他编译器采用),这可能是因为它被认为对编写不会多次评估其参数的宏很重要。

如果你在必须阅读的代码中遇到它,你应该知道它是什么以及它做了什么,但我会避免自己使用它。 这是令人困惑,不必要和非标准的。 使用静态内联函数几乎总能实现相同的function。

我不相信它确实有效… n在括号内有本地范围…当你退出大括号时, n变得未定义虽然我认为它仍然可以存在于堆栈的某个位置并且可能有效。 它正在乞求实施问题,我保证是依赖于实现的。

我可以告诉你的一件事是,任何为我写作的人都会读到暴乱行为。

有用。 我没有得到gcc的警告,所以我认为它符合标准。

封闭的魔力是:

 { int n; scanf("%d", &n); n*n; } 

这个块从控制台扫描一个整数(没有错误检查)并将其平方,返回平方数。 在C的古老实现中,返回堆栈上的最后一个数字。 n*n将数字放在堆栈上。

该值传递给printf:

 printf("%d\n", ); 

所以,回答你的问题:是的,它有效。 是的,这是“标准”(在某种程度上,任何人都完全遵循标准)。 不,这不是一个很好的做法。 这是一个很好的例子,我用膝跳反应称之为“编译器情书”,主要是为了表明程序员有多聪明,不一定要解决问题或高效。