Switch struktura je velmi podobná IF struktuře. Mějme program

#include <stdio.h>

int main()
{
    int x = 20;

    if (x == 10) {
        printf("Hodnota je 10\n");
    } else if (x == 20) {
        printf("Hodnota je 20\n");
    }

    return 0;
}

Tento program můžeme přepsat pomocí struktury Switch. Struktura switch má následující diagram

switch

V kódu bychom měli

#include <stdio.h>

int main()
{
    int x = 20;

    switch (x) {
        case 10:
            printf("Hodnota je 10\n");
            break;
        case 20:
            printf("Hodnota je 20\n");
            break;
    }

    return 0;
}

Dostáváme stejný výsledek jako v programu s IF strukturou. Switch se skládá z hodnoty, kterou dáme do závorek za klíčové slovo switch (v našem případě proměnná x).

switch (x)

Dále se skládá z jednotlivých case bloků (někdy také říkáme case větví).

case 10:

Jak se program vykonává

  1. Vytvoří se proměnná typu int s identifikátorem x a nastaví se jí hodnota 20
  2. switch zkontroluje hodnotu proměnné x
  3. Zkontroluje se, zda je hodnota x rovná 10 - není, pokračuje se na další case
  4. Zkontroluje se, zda je hodnota x rovná 20 - ano, je
  5. Vytiskne se Hodnota je 20
  6. Ukončí se switch pomocí klíčového slova break
  7. Program se ukončí pomocí return 0

Hodnota "default"

Co kdybychom chtěli mít ve Switch i case, který by odchytil libovolnou jinou hodnotu? Něco jako else v if struktuře.

Mějme program s IF strukturou

#include <stdio.h>

int main()
{
    int x = 25;

    if (x == 10) {
        printf("Hodnota je 10\n");
    } else if (x == 20) {
        printf("Hodnota je 20\n");
    } else {
        printf("Hodnota je neznama\n");
    }

    return 0;
}

K tomu nám slouží v případě switch struktury klíčové slovo default.

Předchozí program můžeme přepsat pomocí switch struktury následovně

#include <stdio.h>

int main()
{
    int x = 25;

    switch (x) {
        case 10:
            printf("Hodnota je 10\n");
            break;
        case 20:
            printf("Hodnota je 20\n");
            break;
        default:
            printf("Hodnota je neznama\n");
            break;
    }

    return 0;
}

Při spuštění dostáváme

Hodnota je neznama

K čemu slouží klíčové slovo break? Ukončuje nám aktuální case. Můžeme se podívat, co se stane, když ho tam nedáme. Změňme hodnotu x na 10.

#include <stdio.h>

int main()
{
    int x = 10;

    switch (x) {
        case 10:
            printf("Hodnota je 10\n");
        case 20:
            printf("Hodnota je 20\n");
            break;
        default:
            printf("Hodnota je neznama\n");
            break;
    }

    return 0;
}

Vytiskne se nám

Hodnota je 10
Hodnota je 20

Jak se program vykonává

  1. Vytvoří se proměnná typu int s identifikátorem x a nastaví se jí hodnota 10
  2. switch zkontroluje hodnotu proměnné x
  3. Zkontroluje se, zda je hodnota x rovná 10 - ano, je
  4. Vytiskne se Hodnota je 10
  5. Case 20 se ignoruje
  6. Vytiskne se Hodnota je 20
  7. Ukončí se switch pomocí klíčového slova break
  8. Program se ukončí pomocí return 0

Toho platí i pro default sekci. Vynechme v našem programu i druhý break

#include <stdio.h>

int main()
{
    int x = 10;

    switch (x) {
        case 10:
            printf("Hodnota je 10\n");
        case 20:
            printf("Hodnota je 20\n");
        default:
            printf("Hodnota je neznama\n");
    }

    return 0;
}

Tisknou se všechny větve. Dostáváme

Hodnota je 10
Hodnota je 20
Hodnota je neznama

Pokud bychom nastavili x na 20, tisklo by se

Hodnota je 20
Hodnota je neznama

Toho se dá využít v případě, že chceme pro několik hodnot stejný kód

#include <stdio.h>

int main()
{
    int x = 10;

    switch (x) {
        case 10:
        case 20:
            printf("Hodnota je 10 nebo 20\n");
            break;
        default:
            printf("Hodnota je neznama\n");
    }

    return 0;
}

Což bychom mohli napsat pomocí IF struktury například takto

#include <stdio.h>

int main()
{
    int x = 10;

    if (x == 10 || x == 20) {
        printf("Hodnota je 10 nebo 20\n");
    } else {
        printf("Hodnota je neznama\n");
    }

    return 0;
}

Kdy použít if a kdy switch? Switch nám dává jasně najevo, že kontrolujeme jeden výraz akorát na různé hodnoty. V případě if můžeme mít mnohem komplexnější podmínky.

Je to hodně o osobních preferencích. Někdo nepíše switch nikdy, někdo ho používá pokaždé, když může. Nelze říct, že jedno řešení je výrazně lepší než to druhé. Pokud se vám switch líbí, tak ho můžete používat.

Odkazy

Následující kapitola: Rekurzivní funkce

GitHub diskuze k této kapitole

Zpátky na přehled

Předchozí kapitola: Priorita operátorů