Nadawanie wartości zmiennym strukturalnym

Wstęp

Wykład i zajęcia praktyczne opierają się głównie na najbardziej podstawowej wersji języka C: ANSI C. Ale nie jest prawdą, że język C zastygł na poziomie roku 1978 (kiedy opublikowano pierwszą wersję podręcznika Kernighan B.W., Ritchie D.M., C Proigramming Language (Język ANSI C}). ANSI (American National Standards Institute) w roku 1989 opublikowało pierwszy otwarty standard języka C. Język rozwija się i publikowane są kolejne wersje standardu. Aktualnie obowiązuje wersja C23 opublikowana w roku 2024 jako ISO/IEC 9899:2024, która zastępuje wersję C17, która zastępuje… Każda z tych wersji wprowadza, niesprzeczne z poprzednimi, nowe, interesujące właściwości języka.

Nadawanie wartości zmiennym strukturalnym

Na wykładzie mówię, że „Język C nie pozwala na nadawanie wartości tablicom, czy zmiennym strukturalnym poza deklaracją”. To znaczy jest możliwe coś takiego:

int t[4]={1, 2, 3, 4};

ale nie jest możliwe coś takiego:

int t[4];
...
t = {3, 4, 5, 6};

podobnie ze zmiennymi strukturalnymi

typedef struct {
    int l;
    int m;
} ulamek;
...
ulamek a = {1, 2}, b = {3, 4}, c;

ale nie da się napisać nic takiego

c = {7, 8};

Zmiany wprowadzone w standardzie C99

Otóż standard ten wprowadza coś co się nazywa „literały złożone” (compound literals), co pozwala napisać coś takiego:

c = (ulamek) {7, 8};

Ten zapis jest dosyć przewrotny i równoważny czemuś takiemu:

{
    ulamek temp = {7, 8};
    c = temp;
}

Czyli tworzony jest tymczasowy obiekt temp typu ulamek, któremu nadawana jest wartość ({7, 8}), a następnie już „standardowo” wartość tej tymczasowej zmiennej jest przepisywana do zmiennej c.

W sumie dosyć skomplikowane, ale trochę upraszcza to kod źródłowy.

Nie da się tego łatwo powtórzyć z tablicami automatycznymi, ale już z dynamicznymi tak:

int * t;
...
t = (int [2]) {1, 3};

i działa to w ten sposób, że tworzony jest tymczasowy obiekt (tablica typu int o dwu elementach o wartościach 2 i 3) i adres tego obiektu przypisywany jest do zmiennej (wskaźnikowej) t:

{
    int temp[2] = {1, 3};
    t = &temp;
}
Poprzedni
Następny