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. The output is 10.
  2. There doesn't need to be a semicolon because the whole thing is a function definition.
  3. The structure tag st is declared at global scope and is therefore visible to 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 に答える