2014-09-26 5 views
6

zgodnie z normą ISO/IEC 9899: 1999 6.7.5 §2,Declarators semantyka w C99

Każdy declarator deklaruje jeden identyfikator, i twierdzi, że po pojawieniu się declarator operand tego samego formie w wyrażeniu wyznacza funkcję lub obiekt z zakresem, czasem trwania i typem wskazanym przez specyfikatory deklaracji .

Nie mam pojęcia, dlaczego wyrażenie pojawia się nagle w semantykach deklaratorów. Czy podasz mi kilka przykładów, które pomogą mi zrozumieć znaczenie?

Odpowiedz

4

Say masz deklarację

int foo[42]; 

Częścią deklaratora jest foo[42]. Ilekroć coś w tej samej postaci (tj. foo, po którym następuje [, po którym następuje wyrażenie, po którym następuje ]) pojawia się w obrębie wyrażenia (a delaracja jest w zakresie), typ tego podeksperymentu będzie wynosił zadeklarowanego typu int.

Ujmując to w inny sposób: Jeśli chodzi o składnię idzie, deklarację jak

int *bar; 

robi nie zadeklarować bar być typu int *, ale zamiast deklaruje *foo być typu int.

dla bardziej zaangażowanych przykład przyjąć deklarację

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

w wyrażeniu, operand z samej formie może wyglądać następująco

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

Według cytatu, prawej ręki miałby typ float.

Oznacza to, że

*op[i] 

musi mieć typ funkcyjny (możemy ignorować faktu, że Oznaczenia funkcyjne rozpad do odpowiednich rodzajów wskaźnik i wywołania funkcji przez Postfix () faktycznie działa na wskaźniki, a nie oznaczników).

To z kolei oznacza, że ​​

op[i] 

musi oznaczać wskaźnik funkcji, a my w końcu dotrzeć

op 

oznaczający tablicę wskaźników funkcji jako to co możemy zastosować postfix [] na i dostać z powrotem właściwy typ.

zabawa, prawda;)

+0

Twoje przykłady są tak łatwe do zrozumienia. Dziękuję z całego serca! –

5

Say zadeklarować:

static int const i, j, k; 

To jest taki sam jak:

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

declarator specifer, static int const jest stosowana do wszystkich identyfikatorów.

Można również rozszerzyć tę logikę do funkcji i wskaźników funkcji.

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

który jest taki sam jak:

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

Jeśli chodzi o pojawia się w wyrażeniu część idzie, istnieje jakiś komentarz na http://c0x.coding-guidelines.com/6.7.5.pdf. Mówi:

Semantyka

Każdy declarator deklaruje jeden identyfikator, i twierdzi, że gdy argument o tej samej postaci, jak pojawi się declarator w wyrażeniu, to oznacza funkcję lub obiekt z zakresem, czas przechowywania i rodzaj wskazany przez specyfikatorów deklaracji.

Komentarz

formie identyfikatora w wyrażeniu może być taka sama, jak w declarator. Na przykład, deklarator * x będzie miał tę formę w wyrażeniu, gdy wymagana jest wartość wskazana przez x, a deklarator y [2] będzie miał tę formę w wyrażeniu, gdy odwołany zostanie element tablicy y. Jest to część deklaratora deklaracji, która deklaruje identyfikator. Jest to szczególny rodzaj declarator, abstrakcyjne-declarator, które nie deklarują identyfikator

interpretować powyższe na myśli:

Jeśli zadeklarujesz:

int *x; 

i używać *x w wyrażeniu typ *x to int.

Jeśli zadeklarujesz

static int const *x; 

i używać *x w wyrażeniu, rodzaj *x jest static int const.

Dodatkowe informacje

Static Variable Declaration (C)

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

C -- Accessing a non-const through const declaration

+0

Nie widzę żadnych wyrażeń w Waszych przykładach. W jaki sposób są one połączone z wyrażeniami? –

0

Wszystko to powiedzenie jest, biorąc pod uwagę deklarację jak

const int a = 5; // declaration 

wtedy argumentua w wyrażeniu jak

x = a + b 

zasięgu ten sam zakres ma typ const int.

+0

to jest trywialny przykład, ponieważ deklarator jest po prostu identyfikatorem – Christoph