switch – příkaz (C)
Příkazy switch a case umožňují ovládat komplexní podmíněné operátory a operátory větvení.Příkaz switch předává řízení příkazu v jeho těle.
Syntax
Příkaz výběru:
**switch (výraz)**příkazPříkaz s popiskem:
case výraz konstanty : příkazvýchozí: příkaz
Řízení bude předáno příkazu, jehož výraz konstanty case odpovídá hodnotě switch (výraz).Příkaz switch může obsahovat libovolný počet instancí case, žádné dvě konstanty case v rámci stejného příkazu switch nesmí mít stejnou hodnotu.Spuštění těla příkazu začíná u vybraného příkazu a pokračuje až na konec těla nebo dokud příkaz break nepřesune řízení mimo tělo.
Použití příkazu switch obvykle vypadá takto:
switch ( výraz )
{
deklarace
.
.
.
casevýraz konstanty**:**
příkazy, které jsou provedeny, pokud se výraz rovná
hodnotě výrazu konstanty
.
.
.
break;
default :
příkazy, které jsou provedeny, pokud se výraz nerovná
žádné konstantě výrazu case
}
Příkaz break lze použít pro ukončení zpracování v konkrétního příkazu case v rámci příkazu switch a pro přechod na konec příkazu switch.Bez použití příkazu break bude program pokračovat k dalšímu příkazu case a bude provádět příkazy do doby, než narazí na příkaz break nebo na konec příkazu.V některých případech nemusí být toto pokračování žádoucí.
Příkaz default je proveden, není-li žádný výraz konstanty příkazu case roven hodnotě výrazu switch ().Je-li příkaz default vynechán a není nalezena žádná shoda pro příkaz case nejsou vykonány žádné příkazy switch v těle.Existovat může nejvýše jeden příkaz default.Příkaz default se nemusí nacházet pouze na konci a může se zobrazit kdekoli v těle příkazu switch.Popisek case nebo default se může nacházet pouze uvnitř příkazu switch.
Typ výrazu switch a výrazu konstanty case musí být integrální.Hodnota každého výrazu konstanty case musí být jedinečná v rámci těla příkazu.
Popisky case a default příkazu switch jsou významné pouze v prvním testu, který určuje, kde v těle příkazu dojde ke spuštění.Příkazy switch mohou být vnořené.Jakékoli statické proměnné jsou inicializovány před jejich provedením v příkazech switch.
[!POZNÁMKA]
Deklarace se mohou zobrazit v čele složeného příkazu tvořící tělo příkazu switch, ale inicializace, které jsou zahrnuty v deklaracích nejsou provedeny.Příkaz switch předá řízení přímo spustitelnému příkazu v těle, vynecháním řádků obsahujících inicializací.
Následující příklady zobrazují příkazy switch:
switch( c )
{
case 'A':
capa++;
case 'a':
lettera++;
default :
total++;
}
Všechny tři příkazy těla switch jsou v tomto příkladu spuštěny, pokud se c rovná 'A', jelikož se před předchozím příkazem case neobjevil příkaz break.Řízení je přeneseno na první příkaz (capa++;) a pokračuje v pořadí napříč zbytkem těla.Je-li c rovno 'a', jsou lettera a total inkrementovány.Pouze total se zvyšuje, není-li c rovno 'A' nebo 'a'.
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
V tomto příkladu příkaz break následuje za každým příkazem těla switch.Příkaz break vynutí východ z těla příkazu po provedení jednoho příkazu.Je-li i rovno -1, je zvýšeno pouze n.Příkaz break, který následuje příkaz n++; způsobí předání řízení mimo tělo příkazu, vynecháním zbývajících příkazů.Podobně, pokud je i rovno 0, je zvýšeno pouze z. Pokud se i rovná 1, je zvýšeno pouze p.Poslední příkaz break není nezbytně nutný, jelikož řízení je na konci složeného příkazu předáno mimo tělo funkce, je zde však z důvodu konzistence.
Jeden příkaz může obsahovat více popisků case, jak ukazuje následující příklad:
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : hexcvt(c);
Pokud se v tomto příkladu rovná výraz konstanty jakémukoli písmenu mezi 'a' a 'f', dojde k zavolání funkce hexcvt.
Specifické pro Microsoft
Microsoft C neomezuje počet případových hodnoty v prohlášení switch.Počet je omezen pouze dostupnou pamětí.ANSI C vyžaduje alespoň 257 povolených popisků případu v příkazu switch.
Ve výchozím nastavení pro jazyk Microsoft C jsou rozšíření společnosti Microsoft povoleny.Použijte možnost kompilátoru /Za pro zákaz těchto rozšíření.
Specificka produktu Microsoft END