2014-09-26 19 views
6

nach ISO/IEC 9899: 1999 6.7.5 §2,Deklaratoren Semantik in C99

Jeder declarator erklärt eine Kennung, und behauptet, dass wenn ein Operand der gleichen Form wie der declarator erscheint In einem Ausdruck bezeichnet es eine Funktion oder ein Objekt mit dem Gültigkeitsbereich , der Speicherdauer und dem Typ, die von den Deklarationsspezifizierern angegeben werden.

Ich habe keine Ahnung, warum ein Ausdruck plötzlich in der Semantik der Deklaratoren auftaucht. Würden Sie mir einige Beispiele geben, die mir helfen können, die Bedeutung zu verstehen?

Antwort

4

Angenommen, Sie haben die Erklärung

int foo[42]; 

Der Deklarationsteil ist foo[42]. Immer wenn etwas von der gleichen Form (dh foo gefolgt von [ gefolgt von einem Ausdruck gefolgt von ]) innerhalb eines Ausdrucks erscheint (und die Delaration im Bereich ist), wird der Typ dieses Unterausdrucks vom deklarierten Typ int sein.

es anders auszudrücken: Was die Syntax geht, eine Erklärung wie

int *bar; 

tut nichtbar erklären von int * Typ sein, aber erklärt stattdessen *foo von int Typ sein.

Für ein beteiligter Beispiel nehmen Sie die Erklärung

float (*op[42])(float, float); 

In einem Ausdruck, könnte ein Operand von derselben Form dieser

c = (*op[i])(a, b); 

Nach dem Angebot aussehen, die rechte Seite würde Typ float haben.

Dies bedeutet, dass

*op[i] 

Funktionstyp haben muss (wir ignorieren die Tatsache, dass Funktion Bezeich Zerfall Zeigertypen und Funktionsaufruf über postfix () tatsächlich funktioniert auf Zeigern auf entsprechende, nicht Bezeich).

Dies wiederum bedeutet, dass

op[i] 

einen Funktionszeiger bezeichnen müssen und wir endlich ankommen bei

op 

eine Reihe von Funktionszeiger bezeichnet als das ist, was wir Postfix [] auf und bekommen bewerben Zurück den richtigen Typ.

Spaß, ist es nicht;)

+0

Ihre Beispiele sind so einfach zu verstehen. Danke von ganzem Herzen! –

5

Sagen Sie bitte erklären:

static int const i, j, k; 

Das gleiche ist, wie:

static int const i; 
static int const j; 
static int const k; 

Die declarator specifer, static int const auf alle Bezeichner angelegt wird.

Sie können diese Logik auch auf Funktionen und Funktionszeiger erweitern.

static int i, (*fun1)(void), fun2(void); 

das gleiche ist, wie:

static int i; 
static int (*fun1)(void); 
static int fun2(void); 

Was die in einem Ausdruck erscheint Teil geht, gibt es einige Kommentare zu http://c0x.coding-guidelines.com/6.7.5.pdf ist. Dort heißt es:

Semantiken

Jeder declarator erklärt eine Kennung, und behauptet, dass, wenn ein Operanden der gleichen Form wie der declarator in einem Ausdruck erscheint, eine Funktion oder ein Objekt mit dem Rahmen bezeichnet, Speicherdauer und Typ, der von den Deklarationsspezifizierern angegeben wird.

Commentary

Die Form eines Bezeichners in einem Ausdruck ist wahrscheinlich das gleiche wie die in dem declarator sein. Zum Beispiel wird der Deklarator * x diese Form in einem Ausdruck haben, wenn der Wert, auf den x zeigt, benötigt wird, und der Deklarator y [2] wird diese Form in einem Ausdruck haben, wenn auf ein Element des Arrays y Bezug genommen wird. Es ist der deklaratorische Teil einer Deklaration, der den Bezeichner deklariert. Es ist eine besondere Art von declarator, eine abstrakte-declarator, die nicht eine Kennung

nicht erklären Ich interpretiere die oben bedeuten:

Wenn Sie erklären:

int *x; 

und verwenden *x In einem Ausdruck ist der Typ *xint.

Wenn Sie

static int const *x; 

deklarieren und verwenden *x in einem Ausdruck, ist die Art der *xstatic int const.

Weitere Referenzen

Static Variable Declaration (C)

Is [ ] also a declarator (when used in parameter declaration) in C?

C -- Accessing a non-const through const declaration

+0

Ich sehe keine Ausdrücke in Ihren Beispielen. Wie sind diese mit Ausdrücken verbunden? –

0

Alles, was sagen will, ist, da eine Erklärung wie

const int a = 5; // declaration 

dann die Operanda in einem Ausdruck wie

x = a + b 

innerhalb Derselbe Bereich hat den Typ const int.

+0

Dies ist das triviale Beispiel, da der Deklarator nur ein Bezeichner ist – Christoph