9

请检查以下程序。

#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) ;
}

以下是问题

  1. 程序的输出是什么?
  2. 哪里 ';' 终止“struct st”的声明?

    根据 ISO IEC 9899 - 1999 规范,声明应以“;”结尾。

        declaration-specifiers init-declarator-listopt ;
    
  3. 如果“struct st”的声明仅代表函数“fn”的返回类型,那么它对其他函数(main)如何可见?

4

2 回答 2

9
  1. 输出为 10。
  2. 不需要分号,因为整个事情都是一个函数定义。
  3. 结构标签st在全局范围内声明,因此对 main 可见。
于 2009-11-13T09:45:31.087 回答
5

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

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 */
}
于 2009-11-13T16:09:23.640 回答