DODATEK C PODSUMOWANIE ZMIAN ków # \ ~ [] { } | ~ (patrz p. A 12.1). Zauważ, że wprowadzone sekwencje trzy znakowe mogą zmienić znaczenie stałych napisowych zawierających ciąg ??.
• Wprowadzono nowe słowa kluczowe (void, const, volatile, signed, enum). Usunięto martwe słowo kluczowe entry.
• Zdefiniowano nowe sekwencje specjalne do użytku w stałych znakowych i napisowych. Nie jest zdefiniowany efekt użycia \ ze znakiem nie należącym do zatwierdzonego zestawu sekwencji specjalnych. Patrz p. A2.5.2.
• Przez wszystkich faworyzowana mała zmiana: 8 i 9 nie są cyframi ósemkowymi.
• Wprowadzono większą liczbę przyrostków dla oznaczenia typu stałych: U lub L dla całkowitych i F lub L dla zmiennopozycyjnych. Wysubtelniono również zasady rozstrzygania o typach stałych bez przyrostka (p. A2.5).
• Sąsiadujące ze sobą stałe napisowe są sklejane.
• Wprowadzono notację dla napisów i stałych znakowych zawierających znaki z rozszerzonego zbioru znaków; patrz p. A2.6.
• Za pomocą słów kluczowych signed i unsigned można jawnie deklarować, czy stałe znakowe i innych typów mają znak arytmetyczny. Usunięto zwrot long float jako synonim do double, można natomiast używać long double do zadeklarowania dodatkowej precyzji wielkości zmiennopozycyjnych.
• Od jakiegoś czasu stosuje się zwrot unsigned char. W Standardzie wprowadzono słowo kluczowe signed, by jawnie podkreślać, że obiekty typu char i innych typów arytmetycznych mają znak.
• Od kilku lat w większości implementacji jest dostępne słowo kluczowe void. Standard wprowadza void 1 jako ogólny typ wskaźnikowy; poprzednio rolę tę pełnił char 1. Jednocześnie ustanowiono jawne zasady dotyczące mieszania wskaźników i liczb całkowitych lub wskaźników różnych typów bez użycia operatora rzutowania.
• Standard ustala minimalne zakresy dla wartości typów arytmetycznych i wyznacza specjalne nagłówki (<limit.h> i <float.h>), które mają zawierać charakterystyki poszczególnych implementacji.
• Wyliczenia nie były znane za czasów pierwszego wydania tej książki.
• Standard adoptuje z języka C++ pojęcie kwalifikatora typu, np. const (p. A8.2).
• Stałe napisowe już nie mogą być modyfikowane i można je umieszczać w pamięci chronionej przed zapisem.
DODATEK C PODSUMOWANIE ZMIAN_
waj double” mówi się teraz „promuj do najmniejszego, ale nego typu”. Patrz p. A6.5.
• Stare operatory przypisania, jak =+, zniknęły całkowicie. Ponadto operatory przypisania są pojedynczymi leksemami; w poprzednim wydaniu książki były one parami leksemów i mogły być rozdzielone odstępami.
• Unieważniono prawo kompilatorów do traktowania operatorów łącznych matematycznie jako łączne obliczeniowo.
• Wprowadzono jednoargumentowy operator + dla symetrii z jednoargumentowym —.
• Wskaźnik do funkcji może być używany jako nazewnik funkcji bez jawnego stosowania operatora 2. Patrz p. A7.3.2.
• Struktury mogą być przypisywane, przekazywane funkcjom i zwracane przez funkcje.
• Dopuszcza się stosowanie operatora adresu do tablic; wynikiem jest wskaźnik do tablicy.
• W pierwszym wydaniu książki operator sizeof zwracał typ int; wiele późniejszych implementacji zmieniło to na unsigned. Standard wyraźnie uzależnia ten typ od implementacji, ale wymaga, aby był on (pod nazwą size_i) zdefiniowany w standardowym nagłówku (<stddef.h>). Podobna zmiana dotyczy typu różnicy wskaźników (ptrdiff_t). Patrz p. A7.4.8 i A7.7.
• Operator adresu & nie może odnosić się do obiektów zadeklarowanych jako register, nawet jeśli w danej implementacji ten obiekt nie jest trzymany w rejestrze.
• Typem wyrażenia przesunięcia jest typ jego lewego argumentu; prawy argument nie może mieć wpływu na typ wyniku. Patrz p. A7.8.
• Standard zezwala na tworzenie wskaźnika pokazującego tuż za koniec tablicy i pozwala używać go w obliczeniach i relacjach; patrz p. A7.7.
• Standard wprowadza (zapożyczając od C++) notację deklaracji prototypu funkcji ustalającego typy parametrów oraz określa jawne oznaczanie funkcji ze zmienną liczbą argumentów i aprobowany sposób postępowania z nimi. Patrz p. A7.3.2, A8.6.3, B7. Starsza notacja jest (z pewnymi ograniczeniami) nadal akceptowana.
• Puste deklaracje, które nie mają deklaratorów i nie deklarują przynajmniej struktury, unii lub wyliczenia, są przez Standard zabronione. Z drugiej strony, deklaracja tylko z etykietką struktury lub unii zmienia deklarację tej etykietki, nawet jeśli przedtem jej zasięg był szerszy.
347
„Zwykłe przekształcenia arytmetyczne” uległy zmianie. Zamiast „wśród typów całkowitych zawsze zwycięża unsigned; w operacjach zmiennopozycyjnych uży-
Deklaracje zewnętrzne bez jakichkolwiek specyfikatorów i kwalifikatorów (po prostu goły deklarator) są zabronione.