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


         

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


switch (i) ; // Синтаксически правильный оператор выбора… switch (j) {} // Ещё один… Такой же бесполезный и правильный… switch (r) i++;// Этот правильный оператор также не работает.

В теле условного оператора в качестве оператора может быть использовано определение:

switch (k) { int q, w, e; }

Этот оператор выбора содержит определения объектов с именами q, w, e.

Туда могут также входить операторы произвольной сложности и конфигурации:

switch (k) { int q, w, e; q = 10; e = 15; w = q + e; }

Входить-то они могут, а вот выполняться в процессе выполнения условного оператора не будут!

А вот включение в оператор выбора операторов определений с одновременной инициализацией создаваемого объекта недопустимо. И об этом мы уже говорили. Оно вызывает сообщение об ошибке независимо от того, в каком месте оператора выбора оно располагается:

switch (k) { int q = 100, w = 255, e = 1024; // Ошибка… default: int r = 100; // Опять ошибка… }

Дело в том, что в ходе выполнения оператора объявления с одновременной инициализацией создаваемого объекта происходят два события:

во-первых, производится определение переменной, при котором выделяется память под объект соответствующего типа: int q; int w; int e;

во-вторых, выполняется дополнительное днйствие - нечто эквивалентное оператору присвоения: q = 100; w = 255; e = 1024;

а вот этого в данном контексте и не разрешается делать! Просто так операторы в теле условного оператора не выполняются.

При этом возникает странная ситуация: создание объекта в памяти со случайным значением оказывает на процесс выполнения программы меньшее влияние, нежели создание того же самого объекта с присвоением ему конкретного значения.

Казалось, логичнее было бы не делать никаких различий между операторами объявления и прочими операторами. Но дело в том, что оператор выбора состоит из одного единственного блока. И нет иного пути создания объекта с именем, область действия которого распространялась бы на всё тело оператора выбора, как разрешение объявления переменных в любой точке оператора выбора. Судя по всему, переменная создаётся до того момента, как начинают выполняться операторы в блоке. Объявление превыше всего!

И всё же, какие операторы выполняются в теле оператора выбора (разумеется, за исключением объявления без инициализации)? Ответ: все подряд, начиная с одного из помеченных.

Возможно, что помеченного меткой "default:". При этом в теле оператора выбора может быть не более одной такой метки. switch (val1) default: x++;




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