С++ для начинающих




Инструкция switch - часть 2


default: // любой символ, не являющийся гласной

    ++non_vowe1_cnt;

Константное выражение в метке case должно принадлежать к целому типу, поэтому следующие строки ошибочны:

// неверные значения меток

case 3.14: // не целое

case ival: // не константа

Кроме того, две разные метки не могут иметь одинаковое значение.

Выражение условия в инструкции switch может быть сколь угодно сложным, в том числе включать вызовы функций. Результат вычисления условия сравнивается с метками case, пока не будет найдено равное значение или не выяснится, что такого значения нет. Если метка обнаружена, выполнение будет продолжено с первой инструкции после нее, если же нет, то с первой инструкции после метки default (при ее наличии) или после всей составной инструкции switch.

В отличие от if-else инструкции, следующие за найденной меткой, выполняются друг за другом, проходя все нижестоящие метки case и метку default. Об этом часто забывают. Например, данная реализация нашей программы выполняется совершенно не так, как хотелось бы:

#include <iostream>

int main()

{

    char ch;

    int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;

    while ( cin >> ch )

        // Внимание! неверная реализация!

        switch ( ch ) {

            case 'a':

                ++aCnt;

            case 'e':

                ++eCnt;

            case 'i':

                ++iCnt;

            case 'o':

                ++oCnt;

            case 'u':

                ++uCnt;

        }

    cout << "Встретилась a: \t" << aCnt << '\n'

         << "Встретилась e: \t" << eCnt << '\n'

         << "Встретилась i: \t" << iCnt << '\n'

         << "Встретилась o: \t" << oCnt << '\n'

         << "Встретилась u: \t" << uCnt << '\n';

}

Если значение ch равно i, выполнение начинается с инструкции после case 'i' и iCnt возрастет на 1. Однако следующие ниже инструкции, ++oCnt и ++uCnt, также выполняются, увеличивая значения и этих переменных. Если же переменная ch равна a, изменятся все пять счетчиков.




Содержание  Назад  Вперед