DODATEK A PRZEWODNIK JĘZYKA C-------
czaj umieszczane w oddzielnych wierszach; w kilku przypadkach liczny zbiór krótkich alternatyw umieszczono w jednym wierszu i opatrzono zwrotem „jeden z”. Symbole terminalne i nieterminalne, które można pominąć, zostały oznaczone przyrostkiem opc\ zapis
{ wyraienieopc }
oznacza więc opcjonalne wyrażenie ujęte w klamry. Pełną składnię języka podano w p. A13.
W przeciwieństwie do gramatyki zamieszczonej w pierwszym wydaniu książki, w niniejszej gramatyce wyraźnie zaznaczono pierwszeństwo i łączność operatorów w wyrażeniach.
Identyfikatory (nazwy) odnoszą się do różnych rzeczy: funkcji; etykietek struktur, unii i wyliczeń; składowych struktur i unii; stałych wyliczeń; nazw typów (typedef) i obiektów. Obiekt, zwany też zmienną, jest miejscem w pamięci; jego interpretacja opiera się na dwóch podstawowych atrybutach: klasie pamięci i typie. Klasa pamięci decyduje o żywotności pamięci związanej z identyfikowanym obiektem; typ nadaje znaczenie wartości obiektu. Nazwa ma także zasięg - tę część programu, w której jest ona znana, oraz łączność - która określa, czy ta sama nazwa z innym zasięgiem odnosi się do tego samego obiektu lub funkcji czy nie. Zasięg i łączność są omówione w p. Al 1.
Istnieją dwie klasy pamięci: automatyczna i statyczna. Klasę pamięci obiektu określa kilka słów kluczowych razem z kontekstem zawierającym deklarację obiektu. Obiekty automatyczne są lokalne w bloku (p. A9.3) i znikają, gdy sterowanie opuści blok. Deklaracje zawarte wewnątrz bloku tworzą obiekty automatyczne, jeśli nie podano specyfikacji klasy pamięci lub użyto specyfikatora auto. Obiekty zadeklarowane jako register są automatyczne i są umieszczane (jeśli to możliwe) w szybkich rejestrach maszyny.
Obiekty statyczne mogą być lokalne dla bloku lub zewnętrzne dla wszystkich bloków: w każdym jednak przypadku zachowują swoje wartości po opuszczeniu i ponownym wejściu do funkcji lub bloku. Wewnątrz bloku (również bloku tworzącego treść funkcji) obiekty statyczne deklaruje się za pomocą słowa static. Obiekty zadeklarowane
na zewnątrz wszystkich bloków, na tym samym poziomie co definic wsze statyczne. Można je uczynić wewnętrznymi dla danej jednostki kompilacji za pomocą słowa kluczowego Static; to nadaje im łączność wewnętrzną. Obiekty stają się globalne dla całego programu, gdy ominie się specyfikację klasy pamięci lub zastosuje słowo kluczowe extem; to nadaje im łączność zewnętrzną.
Wyróżnia się kilka podstawowych typów danych. Opisany w dodatku B standardowy nagłówek <limits.h> definiuje największe i najmniejsze wartości dla tych typów w lokalnej implementacji. Liczby podane w dodatku B pokazują najmniejsze dopuszczalne wielkości.
Obiekty zadeklarowane jako znakowe (char) są dostatecznie duże, aby pomieścić dowolny element zbioru znaków danej instalacji. Wartość obiektu znakowego, do którego wstawiono naturalny znak z tego zbioru, jest nieujemną liczbą całkowitą równą wartości kodu tego znaku. Do zmiennych znakowych można wstawiać także inne wartości, ale zakres tych wartości, a zwłaszcza to, czy mają znak arytmetyczny, zależy od implementacji.
Obiekty zadeklarowane jako unsigned char zajmują tyle samo miejsca, co zwykłe znaki, są jednak zawsze nieujemne; obiekty zadeklarowane jako signed char także zajmują tyle samo miejsca, co zwykłe znaki.
Typ unsigned char nie występował w pierwszym wydaniu książki, ale jest w powszechnym użyciu. Typ signed char jest nowy.
Oprócz obiektów typu char są jeszcze obiekty całkowite o trzech różnych długościach deklarowanych jako: short int (krótka), int (zwykła) i long int (długa). Zwykłe wielkości całkowite mają naturalny rozmiar wynikający z architektury danej maszyny; pozostałe rozmiary wprowadzono dla zaspokojenia szczególnych potrzeb. Dłuższe obiekty całkowite zajmują co najmniej tyle pamięci, co krótsze, ale w konkretnej implementacji zwykłe obiekty całkowite mogą być utożsamione albo z krótkimi obiektami, albo z długimi. Jeśli nie powiedziano inaczej, wszystkie odmiany typu int reprezentują wartości całkowite ze znakiem.
Obiekty całkowite bez znaku, deklarowane jako unsigned, podlegają regułom arytmetyki modulo 2", gdzie n jest liczbą bitów ich reprezentacji; w arytmetyce na wielkościach bez znaku nie może więc wystąpić nadmiar. Zbiór nieujemnych wartości, które można wstawić do obiektu ze znakiem, stanowi podzbiór zbioru wartości, które można wstawić do odpowiedniego obiektu bez znaku; reprezentacja pokrywających się wartości jest taka sama.
17 — Język ANS! C 257