10

我通过一个quora 回答遇到了这个程序

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

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

4

3 回答 3

7

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

如果您在必须阅读的代码中遇到它,您应该知道它是什么以及它会做什么,但我会避免自己使用它。它令人困惑、不必要且不标准。同样的事情几乎总是可以通过静态内联函数实现。

于 2013-04-26T16:00:45.693 回答
0

我不相信它确实有效......n在大括号内具有局部范围......当你退出大括号时,n虽然我认为它可能仍然存在于堆栈中的某个地方并且可能工作,但它变得未定义。它乞求实施问题,我保证取决于实施。

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

于 2013-04-26T15:57:48.350 回答
0

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

神奇的是关闭:

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

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

该值被传递给 printf:

printf("%d\n", <scanned>);

所以,回答你的问题:是的,它有效。是的,它是“标准”(在某种程度上任何人都完全遵循标准)。不,这不是一个很好的做法。这是我下意识地称之为“编译器情书”的一个很好的例子,它的设计主要是为了展示程序员有多聪明,而不一定是为了解决问题或提高效率。

于 2013-04-26T15:58:33.030 回答