Home

ITA - Appunti Cpp 007 - switch

linux cpp

Il costrutto switch è una delle istruzioni mediante le quali si implementa il controllo di flusso in C++.

Esempio switch-case

#include <iostream>

int main()
{
    const int i = 2;
    switch (i)
    {
        case 1:
            std::cout << '1';
        case 2:              // esecuczione inizia in questa etichetta
            std::cout << '2';
        case 3:
            std::cout << '3';
            [[fallthrough]]; // attributo C++17 per silenziare il warning per il fallthrough
        case 5:
            std::cout << "45";
            break;           // terminare l'esecuzione
                             // se non viene dichiarata, vengono controllate anche i casi successivi
        case 6:
            std::cout << '6';
    }

    std::cout << '\n';

    switch (i)
    {
        case 4:
            std::cout << 'a';
        default:
            std::cout << 'd'; // quando nessuna condizione viene soddisfatta
                              // viene eseguita quella di default
    }

    std::cout << '\n';

    switch (i)
    {
        case 4:
            std::cout << 'a'; // non è eseguita
    }

    // quando vengono usate delle enumerazioni con gli withc molti compilatori
    // riportano dei warning
    enum color { RED, GREEN, BLUE };
    switch (RED)
    {
        case RED:
            std::cout << "red\n";
            break;
        case GREEN:
            std::cout << "green\n";
            break;
        case BLUE:
            std::cout << "blue\n";
            break;
    }

    // the C++17 init-statement syntax can be helpful when there is
    // l'inizializzazione C++17 può essere utile quando la conversione di
    // un oggetto a intero o enum non è esplicita
    struct Device
    {
        enum State { SLEEP, READY, BAD };
        auto state() const { return m_state; }

    /*...*/
    private:
        State m_state{};
    };

    switch (auto dev = Device{}; dev.state())
    {
        case Device::SLEEP:
            /*...*/
            break;
        case Device::READY:
            /*...*/
            break;
        case Device::BAD:
            /*...*/
            break;
    }

    // altri esempi ....

    // in questo caso mai nessuno statement è eseguito
    switch (0)
        std::cout << "this does nothing\n";

    // ....
    switch (int n = 1)
    {
        case 0:
        case 1:
            std::cout << n << '\n';
    }
}

Riferimenti