C++.Бархатный путь



         

Выбирающий оператор - часть 3


А возможно, помеченного меткой "case КонстантноеВыражение :". В теле оператора выбора таких операторов может быть сколь угодно много. Главное, чтобы они различались значениями константных выражений.

Нам уже известно, что является константным выражением и как вычисляется его значение.

Небольшой тест подтверждает факт вычисления значения константного выражения транслятором:

switch (x) { int t;// Об этом операторе уже говорили… case 1+2: y = 10; case 3: y = 4; t = 100; // На этом месте транслятор //сообщит об ошибке. А откуда он узнал, что 1+2 == 3 ? // Сам сосчитал… default: cout << y << endl; }

А вот пример, который показывает, каким оразом вычисляется выражение, содержащее операцию запятая:

int XXX = 2; switch (XXX) { case 1,2: cout << "1,2"; break; case 2,1: cout << "2,1"; break; }

Константное выражение принимает значение правого операнда, на экран дисплея выводится первое сообщение.

И ещё один вопрос. Почему множество значений выражения, располагаемого после switch, ограничивается целыми числами. Можно было бы разрешить использование выражения без ограничения на область значений. Это ограничение связано с использованием константных выражений. Каждый оператор в теле оператора выбора выполняется только при строго определённых неизменных условиях. А это означает, что выражения должны представлять константные выражения. Константные выражения в C++ являются выражениями целочисленного типа (константных выражений плавающего типа в C++ просто не существует).

Рассмотрим, наконец, схему выполнения оператора switch:

  • вычисляется выражение в круглых скобках после оператора switch (предварительная стадия);
  • это значение последовательно сравнивается со значениями константных выражений за метками case (стадия определения начальной точки выполнения оператора);
  • если значения совпадают, управление передаётся соответствующему помеченному оператору (стадия выполнения);
  • если ни одно значение не совпадает и в теле оператора case есть оператор, помеченный меткой default, управление передаётся этому оператору (но даже в этом случае сочетание объявления с инициализацией недопустимо!) (стадия выполнения);
  • если ни одно значение не совпадает, и в теле оператора case нет оператора, помеченного меткой default, управление передаётся оператору, следующему за оператором switch (стадия выполнения).




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