DODATEK A PRZEWODNIK JĘZYKA C ____—--
stropy jest funkcją zwracającą wartość całkowitą i mającą dwa parametry: wskaźnik do znaków i wskaźnik do stałych znaków. Nazwy parametrów są w istocie komentarzami. Druga funkcja, rand, nie ma parametrów i zwraca wartość całkowitą.
Deklaratory funkcji z prototypami parametrów stanowią najpoważniejszą zmianę w języku, wprowadzoną przez Standard ANSI. Ich przewagą w stosunku do dcklaratorów „w starym stylu” z pierwszego wydania książki jest możliwość wykrywania błędów i dopasowywania argumentów w wywołaniach funkcji. Spowodowało to jednak wiele zamieszania i nieporozumień przy ich wprowadzaniu, a także konieczność uwzględniania obu postaci deklaracji funkcji. Zachowanie zgodności z poprzednią postacią spowodowało też zeszpecenie składni, wprowadzając słowo void do deklaracji bezpara-metrowych funkcji nowego stylu.
Wielokropek „ służący do deklarowania funkcji ze zmienną liczbą argumentów jest także nowy i wraz z makrami zawartymi w standardowym nagłówku <stdarg.h> formalizuje mechanizm, który w pierwszym wydaniu książki był oficjalnie zakazany, ale nieoficjalnie tolerowany.
Te konstrukcje zostały zapożyczone z języka C++.
W deklaracji obiektu jego inicjowany-deklarator może zawierać wartość początkową deklarowanego identyfikatora. Inicjator, który poprzedza się operatorem =, jest albo wyrażeniem, albo listą inicjatorów zawartą w nawiasach klamrowych. Lista może kończyć się przecinkiem - drobiazg umożliwiający schludne formatowanie programu.
inicjator:
wyrażenie-przypisania { lista-inicjatorów }
{ lista-inicjatorów , }
lista-inicjatorów:
inicjator
lista-inicjatorów , inicjator
Dla obiektów i tablic statycznych wszystkie wyrażenia w inicjatorach muszą być wyrażeniami stałymi opisanymi w p. A7.19. Dla obiektów i tablic auto lub register wyrażenia w inicjatorach muszą także być wyrażeniami stałymi, jeśli inicjator jest listą ujętą w klamry. Jeśli jednak inicjator dla obiektu automatycznego jest pojedynczym
wyrażeniem, to nie musi być wyrażeniem stałym, ale musi mieć typ odp przypisania do tego obiektu.
W pierwszym wydaniu książki nie zezwalano na inicjowanie automatycznych struktur, unii i tablic. Standard ANSI pozwala na to, lecz jeśli inicjator nie jest wyrażeniem prostym, to inicjować je można tylko za pomocą stałych konstrukcji.
Nie zainicjowany jawnie obiekt statyczny jest inicjowany tak, jakby jemu (lub jego składowym) przypisano wartość zero. Początkowa wartość nie zainicjowanego jawnie obiektu automatycznego jest niezdefiniowana.
Inicjatorem dla wskaźnika lub obiektu arytmetycznego jest pojedyncze wyrażenie, być może ujęte w nawiasy klamrowe. Wartość wyrażenia jest wstawiana do obiektu.
Inicjatorem dla struktury jest albo wyrażenie tego samego typu, albo ujęta w nawiasy klamrowe lista inicjatorów dla jej kolejnych składowych. Składowe, które są nie nazwanymi polami bitowymi, są ignorowane i nie są inicjowane. Gdy na liście jest mniej inicjatorów niż składowych struktury, wówczas pozostałe składowe są inicjowane zerami. Nie może być więcej inicjatorów niż składowych.
Inicjatorem dla tablicy jest ujęta w klamry lista inicjatorów dla jej kolejnych elementów. Jeśli nie jest znany rozmiar tablicy, to ten rozmiar wyznacza się na podstawie liczby inicjatorów i typ tablicy staje się kompletny. Jeśli tablica ma ustalony rozmiar, to liczba inicjatorów nie może przekroczyć liczby elementów tablicy; gdy jest ich mniej, wówczas pozostałe elementy są inicjowane zerami.
Specjalnym przypadkiem jest tablica znakowa, która może być inicjowana napisem; kolejne znaki napisu inicjują kolejne elementy tablicy. Podobnie napisem złożonym z rozszerzonych znaków (p. A2.6) można inicjować tablicę o elementach typu wchar_t. Jeśli nie jest znany rozmiar tablicy, to ten rozmiar jest wyznaczony przez liczbę znaków w napisie, włączając w to końcowy znak zerowy; jeśli rozmiar jest ustalony, to liczba znaków w napisie, nie licząc końcowego znaku zerowego, nie może przekroczyć rozmiaru tablicy.
Inicjatorem dla unii jest albo pojedyncze wyrażenie tego samego typu, albo ujęty w klamry inicjator dla jej pierwszej składowej.
W pierwszym wydaniu książki nie wolno było inicjować unii. Zasada „pierwszej składowej” jest niezręczna, ale nie da się tego uogólnić bez zmiany składni. Oprócz możliwości inicjowania unii (przynajmniej w prymitywny sposób) ta zasada ANSI C określa znaczenie nie zainicjowanych jawnie unii statycznych.
291