Г. Шилдт - Полный справочник по C++ (1109478), страница 18
Текст из файла (страница 18)
Как только условие цикла становится ложным, программа передаст упрагьле~ ~ив оператору, стоящему сразу после оператора мМзе. Рассмотрим пример функции, обрабатывающей ввод с клавиатуры, которая терпеливо ждет, пока пользователь ~ ~е введет букву А. сваг назс бог спвг(чей) ( с)зат с?и сп = 'ХО'г /" начальное значение переменной сп ь/ нпт1е(сЬ != 'д') с(з = дессивг()," гесцгп сйч ) Снач.ша псремешюй сЬ присваивается пуль, Поскольку она является локальной, се значение вне функции мв1е док сцак() пе определено.
Затем цикл ъгцхзе проверяет, пе равно ли значение переменнои е)з символу А. Поскольку иачалыюс значение переменной е)з равно нулю, условие цикла является истинным, и его выполнение продолжается. Условие цикла проверяется каждый раз, когда пользователь вводит символ с клавиатуры. Как ~олько оп введет букву А, условие цикла станет ложным, и программа прекратит его выполнение. Как и цикл хек, цикл ъоше проверяет свое условие перед началом выполнения тела. Следовательно, если условие цикла с самого начала является ложным, его тело пе будет выполне(ю ци разу. Благодаря этому свойству нет необходимости отдельно проверить условие цикла перед входом в пего.
Зту особенность хорошо иллюстрирует функция рва(), добавляющая пробелы в конец строки, пока ее длина не станет равной заданной. Если длина строки уже равна требуемой величине, пробелы пе добавляются. Глава 3. Операторы атпс1цде <ясно.)с> Втпс1цбе <яет1од.ц> чоьб раб(сцат *я, ( ес 1еодсЫ 1ое и тб( а) ( снах вес[ВО]с астору(вст, "проверка"); рас)(яст, 40); рт1ост(кас)", вст1еп(яст)); лесото 0; /* добавляет пробелы в конец строки.
*/ чоьб раб(сцат *я, 1ос 1еодсЫ ( Вос 1; 1 = яет1ео(я)с /* Вычисляем длину строки / ы)с11е (1<1епдсЫ ( я[1) †. ' *; /* Вставляем оробел "/ 1++," ) я[1)= '10'; /* Строки должна яавериаться нулевым байтом */ Фуцхцня раб() ИМСЕт даа ар(уМСНта — уКаЗатЕЛЬ в На удпнияСМуЮ СтрОКу И ЦЕЛО- численную переменную 1евдс)с, задаюшую требуемую длину строки. Если исходная длина строки равна числу 1епдсЬ или превышает сто, то тело цикла ъж11е не выполняется.
Если жс длина строки, на которую ссылается указатель я, меньше требуемой, функция раб() добавляет нужное количество пробелов. Длина строки вычисляется с помошыо стандартной функции вет1еа(). Если выход из цикла мЫ.1е зависит от нескольких условий, обычно в качесгве условия цикла используют отдельную переменную, значение которой изменяется несколькими операторами в разных точках цикла.
Рассмотрим пример. чотб Вцос1 (чотб) ( с се мот)стад," ыотхьод = 1) /* т.е., истина */ ыЫ.1е(ыот)с1од) ( ыоткьод = ртосеяя1(); тс(ыотЛс1од) ыотк1вд = ртосеяяз() ьт(тот)с1пд) с<отк1од = ртосеяяз() Каждая функция, вызванная в этом фрагменте программы, может вернуть ложное значение н привести к выходу из цикла. Часть!. Основы языка С+си подмножества С Тело цикла иЬ11е может быть пустым. Например, приведенный нижн пустой цикл выполняется до тех пор, пока пользователь нс введет букву А. й ииз.1е[(сп=дегсцат()) (= 'Л') Оператор присваивания внутри условного выражения цикла иихзе выглядит непривычно, но все встанет на свои места, если вспомнить, что его значснисм является значение операнда, расположенного в правой части. Цикл бо-аЬИе В отличие от операторов хох и ииз.1е, которые проверяют условие в начале цикла, оператор сто-иь11е делает это в конце.
Иными слонами, цикл бо-иь11е выполняется по крайней морс один раз. Общий вид оператора сто-иЬ11е таков. бо ( олералзор; ) иМ1е(условие); Если тело цикла состоит лишь из олного оператора, фигурные скобки нс обязательны, хотя они делают этот цикл понятнее (программисту, но нс компилятору). )зикл стоиЬ11е ПОВтарястСя дО тСХ ПОр, ПОКа уСЛОВиЕ НС Стаихт ЛОЖНЫМ. Рассмотрим пример, в котором цикл с(о-иЬ11е считывает числа с клавиатуры, пока они нс превысят 100. з з с)о ( асалх (*()с)", апнпз) з ) иЬ11е(пнш > 100); Чаше всего оператор сто-и)з11е применяется для выбора пунктов меню, Когда пользователь вводит допустимое значение, оно возвращается соответствующей функцией.
Нсдопустимыс значения игнорируются. Рассмотрим улучшенную версию программы дяя проверки правописания. чо16 шенн(чоьс)) ( снах суи ртьнсб("1. Проверка правописания/и"]з рхьютй("2. Исправление сшибокЫ")з ртьнтх("3. Вывод ошибок хн")з ртьнсй(" Выберите пункт меню: ')з бо ( сЬ = десспах(); /' Считываем символ с клавиатуры */ виьтсЬ(сЬ) ( саве '1'с сиес)с вре111нд(); Ьтеакз саве '2'з соттесс етхотв(); Ьтеа)сз саве '3'з с)ьвр1ау етхотв()з Ьтеа)сз ) иЬ11е(сЬ(='1' ьа сЬ!="2' аа сЬ(='3') ) Глава 3.
Операторы Злесь оператор бо-м(т11е ОЧЕНЬ Улабен, поскольку функция должна вывести меню по краиней морс один раз. Если пользователь ввел допустимое значение, программа продолжит выполнять цикл. .:~ Объявление переменных в условных операторах и циклах В языке С++ (но не в стандарте С89) можно объявлять переменные внутри условных выражений, входящих в операторы 1Е или вм1ссЬ. внутри условия цикла мззв1е, а также в разделе инициализации цикла еох. Область видимости переменной, объявленной в одном из этих трех мест, ограничена блоком, которыи ошасится к данному оператору. Например, переменная, объявленная внутри цикла еох, является локальной по отношению к нему.
Рассмотрим пример, в котором переменная объявлена в разделе инициализации цикла Еох. /* Переменная 1 является локальной па а ношению к циклу Хох, а переменная З существует как внутри, так и вне цикла. */ зпс з; сох(зос 1 = 0; 1<10; 1++) 1*1: /* Ь = 10; // *"* Ошибка *** -- переменная 1 здесь невидима) */ В этом примере переменная х объявлена внутри раздела инициализации цикла Еох и используется в качестве счетчика. Вне цикла сох эта переменная не существует! Поскольку счетчик нужен лишь внутри цикла, его обьявление в разделе инициализации оператора Еох стало общепринятой практикой.
Однако учтите, что стандартам С89 это не допускается. (В стандарте С99 это ограничение снято.) ~ Утверждение, что переменная, обьяаленная а разделе инициализации цикла еох, является локальной, а некоторых компиляторах не выполняется. В старых версиях такие переменные были доступны и ане оператора Еех. Однако стандарт языка С+ь ограничил область видимости таких переменных телом оператора еех. Если ваш компилятор полностью поддерживает стандарт языка С++, то переменные можно обьявлять не только внутри циклов, но и внутри обычных условных выражений. Рассмотрим пример. 1Е(ьпс х = 20) ( х=х — у: ЕЕ(х>10) у = 0; Здесь объявляется переменная х, которой присваивается число 20. Поскольку эта значение считается истинным, выполняется блок, связанный с оператором хе.
Область видимости переменной, объявленной внутри условного выражения, ограничивается этим блоком. Таким образом, вне оператора хЕ переменной х не существует. Честно говоря, не все программисгы считают приемлемым такой способ обьявления переменных„поэтому в нашей книге мы не будем ега применять. Часть (. Основы языка С++: подмножество С : Операторы перехода В языке С/С++ предусмотрены четыре оператора безусловного перехода: гееоге, доео, Ьгеаи, саоеаеое.
Операторы гегоге и досо можно применять в любом месте программы, в то время как операторы ьгеазе и соееЬзще связаны с операторами циклов. Кроме того. оператор Ьгеазе можно применять внутри оператора веаесЛ Оператор гейгп Этот оператор используется для возврата управления из функции. Он относится к операторам безусловного перехода автор орепаогг), поскольку выполняет возврат в точку вызова функции. С ним может бьдь связано определенное значение, хотя это и нс обязательно. Если оператор гееоги связан с определенным значением, оно становится результатом функции.
В стандарте С39 все функции, возвращающие значения, формально нс обязаны были содержать оцсратор геееге. Если программисг забывал указать его, функция возвращала какое-то случайное значение, так называемый "мусор". Однако в языке С++ (и в стандарте С99) все функции, возвращающие значения, обязаны содержать оцсратор гееоге.