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 - 玩类型的主要内容,如果未能解决你的问题,请参考以下文章