2009-11-13 6 views
9

Bitte überprüfen Sie das folgende Programm.C Puzzle - Spiel mit den Typen

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

Im Folgenden sind die Fragen

  1. Was ist die Ausgabe des Programms?
  2. Wo ist ';' die Deklaration von 'struct st' beenden?

    Nach ISO IEC 9899 - 1999 Spezifikation sollte die Deklaration enden mit einem ';'.

    declaration-specifiers init-declarator-listopt ; 
    
  3. Wird die Erklärung des ‚struct st‘ genommen wird, was nur den Rückgabetyp von die Funktion ‚fn‘, wie ist es sichtbar auf andere Funktionen (Haupt-)?

+0

Comeau beschwert sich über die fehlende geschrieben hatte; nach der Struktur und auch das Fn() hat keinen Rückgabetyp. – foraidt

+0

Hausaufgaben? ;) Ich denke, die Ausgabe wäre 10, formatiert als Dezimal (ich nehme an, das ist, was% d bedeutet) – invert

+0

Insbesondere heißt es: Zeile 3: Fehler: Typ-Definition ist nicht erlaubt in Funktion Rückgabetyp Erklärung – foraidt

Antwort

5

Dinge können ein wenig klarer, wenn wir den Code ein wenig umformatieren:

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

Somit ist der Rückgabetyp fn() ist struct st {int a;}. Nach der Strukturdefinition gibt es kein Semikolon, da der Strukturtyp Teil der Funktionsdefinition ist (durch die Grammatik von translation-unit ->top-level-declaration ->function-definition). Der Strukturtyp ist verfügbar für main(), weil Sie ein Struct-Tag (ST) setzen. Haben Sie

geschrieben
struct { int a; } fn() {...} 

dann wäre der Typ main() nicht verfügbar war; Sie müssten einen neuen Strukturtyp mit derselben Definition erstellen.

Sie erhalten den gleichen Effekt wie wenn Sie

struct st { 
    int a; 
}; 

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

int main() 
{ 
    /* same as before */ 
} 
9
  1. Der Ausgang ist 10.
  2. Es ist kein Semikolon zu sein braucht, weil die ganze Sache eine Funktionsdefinition ist.
  3. Das Struktur-Tag st ist im globalen Gültigkeitsbereich deklariert und daher für main sichtbar.
+0

+1 genau das, was ich schreiben wollte. –

+0

4. GCC ist ein bisschen nachsichtiger als ich dachte. –