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