DODATEK A PRZEWODNIK JĘZYKA C_________
Wszystkie z typów zmiennopozycyjnych: pojedynczej (float), podwójnej (double) i rozszerzonej precyzji (long double) mogą być utożsamione, przy tym każdy następny typ z tej listy jest co najmniej tak precyzyjny, jak poprzedni.
Typ long double jest nowy. Konstrukcja long float, w poprzednim wydaniu książki stosowana jako synonim double, została usunięta.
Wyliczenia są unikalnymi typami o wartościach całkowitych; z każdym wyliczeniem jest związany zbiór nazwanych stałych (p. A8.4). Wyliczenia zachowują się jak typy całkowite, przy czym kompilatory produkują zwykle komunikaty ostrzegawcze, jeśli jakiemuś obiektowi o typie wyliczeniowym przypisuje się wartość inną niż wartość jednej z jego stałych lub wyrażenia tego typu.
Ponieważ obiekty powyższych typów mogą być traktowane jak liczby, typy te będziemy nazywali arytmetycznymi. Typy char i int wszystkich rozmiarów (ze znakiem lub bez), a także wyliczenia będą wspólnie nazywane całkowitymi. Typy float, double i long double będą nazywane zmiennopozycyjnymi.
Typ void reprezentuje pusty zbiór wartości. Jest on używany jako typ funkcji, która nie produkuje wartości-.
Oprócz typów podstawowych mamy potencjalnie nieskończoną klasę typów pochodnych, konstruowanych z typów podstawowych:
tablice obiektów danego typu,
funkcje zwracające wartości danego typu,
wskaźniki do obiektów danego typu,
struktury zawierające zestawy obiektów różnych typów,
unie zawierające dowolny z zestawu obiektów o różnych typach.
Podane metody konstruowania obiektów mogą być na ogół stosowane rekurencyjnie.
Z typem obiektu mogą być związane kwalifikatory. Deklarując obiekt jako const wskazujemy, że ten obiekt nie będzie zmieniał wartości; deklarując go jako volatile wskazujemy, że będzie miał specjalne właściwości, ważne przy optymalizacji. Kwalifikatory nie mają wpływu ani na zakres wartości, ani na arytmetyczne właściwości obiektów. Kwalifikatory zostaną omówione w p. A8.2.
A także do oznaczenia pustej listy parametrów w nowej postaci deklaracji funkcji. - Przyp. tłum.
Obiekty i l-wartości
Obiekt jest nazwanym obszarem pamięci; L-wartość (ang. lvalue) jest wyrażeniem odnoszącym się do obiektu. Oczywistym przykładem l-wartości jest identyfikator o odpowiednim typie i klasie pamięci. Również niektóre operatory dają l-wartość: na przykład, jeśli E jest wyrażeniem wskaźnikowym, to *E jest 1-wartością odnoszącą się do obiektu wskazywanego przez E. Nazwa „l-wartość" wywodzi się z wyrażenia przypisania E1=E2, w którym lewy argument musi być l-wartością. Przy omawianiu poszczególnych operatorów zaznaczono, czy dany operator spodziewa się l-wartości jako argumentu i czy w wyniku daje l-wartość.
W zależności od argumentów niektóre operatory mogą powodować przekształcenie wartości pewnego argumentu z jednego typu do innego. W tym punkcie wyjaśnimy, jakich wyników należy się spodziewać po takich przekształceniach. Podsumowanie przekształceń wymaganych przez większość zwykłych operatorów nastąpi w p. A6.5; jeśli zajdzie taka potrzeba, to będzie ono uzupełnione przy opisie poszczególnych operatorów.
W każdym wyrażeniu, w którym może wystąpić wartość całkowita, mogą również wystąpić: znak, wartość całkowita krótka lub całkowite pole bitowe (wszystkie ze znakiem arytmetycznym lub bez) oraz obiekt typu wyliczeniowego. Jeśli typ int może reprezentować wszystkie wartości oryginalnego typu, to dana wartość jest przekształcana do typu int; w przeciwnym przypadku tę wartość przekształca się do typu unsigned int. Ten proces nazywa się promocją typu całkowitego.
Dowolna wielkość całkowita jest przekształcana do danego typu bez znaku przez znalezienie takiej najmniejszej nieujemnej wartości, która jest przystająca (kongruentna) do tej wielkości całkowitej modulo największa wartość reprezentowalna w danym typie zwiększona o 1. W notacji uzupełnieniowej do 2 oznacza to obcięcie bitów z lewej strony, jeśli typ bez znaku jest krótszy, albo uzupełnienie zerami wartości bez znaku lub powielenie bitu znaku wartości ze znakiem, jeśli typ bez znaku jest dłuższy.
259