DODATEK A PRZEWODNIK JĘZYKA C______
Etykiety przypadków (case) i domyślne (default) są używane w instrukcji switch (p. A9.4). Wyrażenie stałe występujące w etykiecie case musi mieć typ całkowity.
Etykiety jako takie nie wpływają na sterowanie programem.
Większość instrukcji to instrukcje wyrażeniowe o postaci
instrukcja-wyrateniowa: wyraienieopc ;
Większość instrukcji wyrażeniowych to przypisania i wywołania funkcji. Wszystkie efekty uboczne spowodowane przez wyrażenie są zakończone przed rozpoczęciem wykonania następnej instrukcji. Konstrukcja, w której pominięto wyrażenie, nazywa się instrukcją pustą; jest ona często używana do oznaczenia pustej treści instrukcji powtarzania lub do wstawiania etykiet.
Aby można było użyć kilku instrukcji tam, gdzie oczekuje się jednej, wprowadzono instrukcję złożoną (zwaną również blokiem). Treść definicji funkcji jest instrukcją złożoną.
instrukcja-złoiona:
{ lista-deklaracji ą)C lista-instrukcjiol,c }
lista-deklaracji: deklaracja
lista-deklaracji deklaracja
lista-instrukcji:
instrukcja
lista-instrukcji instrukcja
Jeśli dowolny identyfikator z listy deklaracji był zadeklarowany na zewnątrz bloku, to jego poprzednia deklaracja jest przesłaniana na czas wykonywania bloku (patrz p. Al 1.1); po opuszczeniu bloku jej ważność będzie przywrócona. Dany identyfikator może być tylko raz zadeklarowany w bloku. Ta zasada dotyczy identyfikatorów nale-
A9 INSTRUKCJE
żących do tej samej przestrzeni nazw (p. Ali); identyfikatory należąc przestrzeni nazw są traktowane jako różne.
Inicjowanie obiektów automatycznych wykonuje się w kolejności ich deklaracji przy każdym wejściu do bloku przez jego początek. Inicjowania nie wykonuje się przy skoku do wnętrza bloku. Inicjowanie obiektów static wykonuje się tylko raz, zanim program rozpocznie działanie.
Instrukcje wyboru służą do wybrania jednej z kilku ścieżek wykonania programu.
instrukcja- wyboru:
if ( wyrażenie ) instrukcja
if ( wyrażenie ) instrukcja else instrukcja
switch ( wyrażenie ) instrukcja
W obu postaciach instrukcji if wyrażenie musi mieć typ arytmetyczny lub wskaźnikowy. Jeśli wartość wyrażenia (po obliczeniu wszystkich efektów ubocznych) jest różna od zera, to wykonuje się pierwszą podinstrukcję. W drugiej postaci, jeżeli wartość wyrażenia jest równa zeru, to wykonuje się drugą podinstrukcję. Niejednoznaczność przyporządkowania else rozstrzyga się, wiążąc else z ostatnią instrukcją if bez else, napotkaną na tym samym poziomie struktury blokowej.
Instrukcja switch powoduje przekazanie sterowania do jednej z szeregu instrukcji, zależnie od wartości wyrażenia (które musi mieć typ całkowity). Podinstrukcja kontrolowana przez instrukcję switch jest w praktyce instrukcją złożoną. Każda instrukcja wewnątrz instrukcji złożonej może być etykietowana jedną lub kilkoma etykietami przypadków (case - p. A9.1). Wyrażenie kontrolne podlega promocji typu całkowitego (p. A6.1), a stałe przypadków są przekształcane do promowanego typu. W jednej instrukcji switch wszystkie stałe przypadków muszą mieć po przekształceniu różne wartości. Z instrukcją switch może być związana co najwyżej jedna etykieta domyślna default. Instrukcje switch mogą być w sobie zagnieżdżone; etykiety case i default są związane z najciaśniej otaczającą je instrukcją switch.
Wykonanie instrukcji switch polega na obliczeniu jej wyrażenia (wraz z efektami ubocznymi) i porównaniu jego wartości z wartościami stałych przypadków. Jeśli wartość jednej ze stałych jest równa wartości wyrażenia, to sterowanie jest przekazywane do instrukcji opatrzonej tą etykietą przypadku. Jeśli żadna ze stałych przypadków nie jest równa wartości wyrażenia i występuje etykieta domyślna default, to sterowanie jest przekazywane do instrukcji opatrzonej tą etykietą. Gdy wszystkie
297