ВОПРОСЫ И ОТВЕТЫ
Конструкции принятия решений и циклы
Предъявляет ли С++ какие-либо требования на отступ операторов в предложениях оператора?
Нет. Отступ определяется только Вами. Типовые размеры отступа составляют два или четыре пробела. Использование отступов делает ваш листинг намного более удобочитаемым.
Вот пример оператора if с записью предложений без отступа:
if ( i > 0 )
j = i * 1;
else
j = 10 - i;
Сравните этот листинг и его вариант с отступами
if ( i > 0 )
j = i * i;
else
j = 10 - i;
Последний вариант читается много легче; легко указать, где операторы if и else. Более того, если вы будете работать с вложенными циклами, отступы еще более значимы в отношении удобочитаемости кода.
Каковы правила написания условий в операторе if-else?
Здесь существуют два подхода. Первый рекомендует писать условия так, что true будет чаще, чем false. Второй подход рекомендует избегать отрицательных выражений (тех, которые используют операции сравнения != и булевы операции !).
Программисты из последнего лагеря преобразуют такой оператор if:
if ( i != 0 )
j = 100/i;
else
j = 1;
в следующую эквивалентную форму:
if ( i == 0 )
j = 1;
else
j = 100/i;
хотя вероятность равенства нулю переменной i достаточно низка.
Как обработать условие, подобное нижеследующему, где имеется деление на переменную, которая может оказаться равной нулю?
if ( i != 0 && 1/i > 1 )
j = i * i;
С++ не всегда оценивает проверяемые условия полностью. Эта частичная оценка происходит, когда член булева выражения превращает все выражение в false или true, независимо от значения других членов. В этом случае, если переменная i равна 0, исполняющая система не будет оценивать 1/i > 1, потому что член i != 0 есть false и обращает в false все выражение, независимо от значения второго члена. Это называется укороченной оценкой булевых выражений.
Действительно ли необходимо включать предложения else или default в многоальтернативные операторы if-else и switch?
Программисты настоятельно рекомендуют включение этих всеохватывающих предложений для гарантии того, что многоальтернативные операторы будут обрабатывать все возможные условия. Однако технически для компиляции программы это не является необходимым.
Как смоделировать цикл while циклом for?
Рассмотрим простой пример.
int i; int i = 1;
for (i=1; i<=10; i+=2) { while ( i <= 10) {
cout << i << endl; cout << i << endl;
} i += 2;
}
Циклу while необходим начальный оператор, инициирующий переменную управления циклом. Заметим также, что внутри цикла while находится оператор, изменяющий значение переменной управления циклом.
Как смоделировать цикл while циклом do-while?
Рассмотрим простой пример.
i = 1; i = 1;
do { while (i <= 10) {
cout << i << endl; cout << i << endl;
i += 2; i += 2;
} while (i <= 10); }
Оба цикла имеют одинаковые условия в предложениях while.
Заметим, однако, что если цикл спроектирован таким образом, что начальное значение i может быть неизвестным заранее, то это может привести к различным эффектам. Например, если i исходно равно 11, то цикл слева выполнится один раз, тогда как цикл справа не сделает ни одной итерации.
Как открытый цикл for может эмулировать циклы while и do-while?
Открытый цикл for эмулирует другие циклы С++ установкой оператора if выхода из цикла в начале или конце цикла. Рассмотрим пример эмуляции цикла while открытым циклом for:
i = 1; i = 1;
while (i <= 10) { for (;;) {
if (i > 10) break;
cout << i << endl; cout << i << endl;
i += 2; i += 2;
} }
Заметим, что открытый цикл for использует оператор if выхода из цикла как первый оператор внутри цикла. Условие, проверяемое оператором if, есть логическое обращение условия цикла while.
Рассмотрим простой пример, иллюстрирующий эмуляцию цикла do-while:
i = 1; i = 1;
do { for (;;) {
cout << i << endl; cout << i << endl;
if (i > 10) break;
i += 2; i += 2;
} while (i <= 10) }
Открытый цикл for использует оператор if выхода из цикла перед концом цикла. Оператор if проверяет обратное логическое условие, так же как в цикле do-while. Однако имейте, пожалуйста, в виду, что приведенные примеры довольно грубы и неэлегантны. Никто никогда не будет использовать открытый оператор for подобным образом. Конечно, можно было бы пропустить одно из трех предложений внутри скобок цикла for (например, предложение инициализации, если управляющая переменная уже инициализирована). Открытые циклы for чаще всего используются в случаях, когда выход из цикла бывает редким событием, например, если при обработке данных, вводимых пользователем с клавиатуры, нажатие клавиши Esc должно приводить к выходу из программы.
Можно ли во вложенном цикле for использовать переменную управления внешним циклом в качестве границы диапазона значений для внутренних циклов?
Да. С++ не только не запрещает такое использование, на самом деле
оно в порядке вещей. Рассмотрим простой пример.
for ( int i = 1; i <= 100; i += 5)
for ( int j = i; i <= 100; j++)
cout < i * j << endl;
Ограничивает ли С++ вложение циклов разных типов?
Нет. В программе на С++ вы можете вкладывать любые комбинации
циклов.