C Puzzle - 玩类型

Posted

技术标签:

【中文标题】C Puzzle - 玩类型【英文标题】:C Puzzle - play with types 【发布时间】:2010-12-16 05:44:18 【问题描述】:

请检查以下程序。

#include <stdio.h>

struct st

 int a ;


fn ()

 struct st obj ;
 obj.a = 10 ;

 return obj ;


int main()

 struct st obj = fn() ;

 printf ("%d", obj.a) ;

以下是问题

    程序的输出是什么?

    ';' 在哪里终止'struct st'的声明?

    通过 ISO IEC 9899 - 1999 规范、声明应 以';'结尾。

        declaration-specifiers init-declarator-listopt ;
    

    如果 'struct 的声明 st' 仅代表返回类型 函数'fn',它是如何可见的 到其他功能(主要)?

【问题讨论】:

科莫抱怨失踪;在结构之后,并且 fn() 没有返回类型。 家庭作业? ;) 我认为输出为 10,格式为十进制(我假设这就是 %d 的意思) 具体说:第3行:错误:函数返回类型声明中不允许类型定义 @mxp 我认为这是C代码,不要编译成C++代码。 我认为家庭作业还没有达到参考规范的程度。我喜欢第二个问题。 【参考方案1】:

如果我们重新格式化一下代码,事情可能会更清楚一点:

struct st  int a;  fn() 

  struct st obj;
  obj.a = 10;
  return obj;

int main()

  struct st obj = fn();
  printf("%d\n", obj.a);
  return 0;

因此,fn() 的返回类型为struct st int a;。结构定义后没有分号,因为结构类型是函数定义的一部分(从translation-unit -> top-level-declaration -> function-definition 跟踪语法)。 main() 可以使用结构类型,因为您在其上放置了结构标记 (st)。你写了吗

struct  int a;  fn() ...

那么main() 将无法使用该类型;您将不得不创建一个具有相同定义的新结构类型。

你得到的效果和你写的一样

struct st 
  int a; 
;

struct st fn() 
 
  /* same as before */


int main()

  /* same as before */

【讨论】:

【参考方案2】:
    输出为 10。 不需要分号,因为整个内容就是一个函数定义。 结构标签st在全局范围内声明,因此对main可见。

【讨论】:

4. GCC 比我想象的要宽容一点。

以上是关于C Puzzle - 玩类型的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 15puzzle-astar.cpp

c_cpp 15puzzle-idastar.cpp

c_cpp 15puzzle-iddfs.cpp

CF-281C Rectangle Puzzle(凸包+面积)

UVa - 227 - Puzzle

[POJ3678] Katu Puzzle | 2-SAT 入门