Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Составные операторы, или блоки ⇐ ПредыдущаяСтр 2 из 2
Формат - или синтаксис - написания оператора for может показаться чересчур ограниченным, поскольку тело цикла должно состоять из всего лишь одного оператора. Это весьма неудобно, если вы хотите, чтобы тело цикла включало несколько операторов. C++ предлагает синтаксис, позволяющий поместить в тело цикла любое количество операторов. Трюк заключается в использовании пары фигурных скобок, с помощью которых конструируется составной оператор, или блок . Блок состоит из пары фигурных скобок с заключенными между ними операторами и синтаксически воспринимается как один оператор. Например, в листинге ниже фигурные скобки применяются для комбинирования трех отдельных операторов в единый блок. Это позволяет в теле цикла организовать вывод приглашения пользователю, прочитать его ввод и выполнить вычисления. Программа вычисляет текущую сумму вводимых значений, и это является удобным случаем для использования операции +=. #include < iostream> int main() { using namespace std; cout < < " The Amazing Accounto will sum and average "; cout < < " five numbers for you.\n"; cout < < " Please enter five values: \n"; double number; double sum = 0.0; for (int i = 1; i < = 5; i++) { // block starts here cout < < " Value " < < i < < ": "; cin > > number; sum += number; } // block ends here cout < < " They sum to " < < sum < < endl; cout < < " and average to " < < sum / 5 < < ".\n";
getchar(); getchar(); return 0; }
Предположим, что вы сохранили отступы, но удалили фигурные скобки: for (int i = 1; i < = 5; i++) cout « " Value " < < i < < ": "; cin » number; sum += number;
Компилятор игнорирует отступы, поэтому в тело цикла попадет только первый оператор. То есть цикл напечатает пять приглашений и ничего более. После завершения цикла программа перейдет к выполнению последующих строк, читая и суммируя только одно значение. Если вы определяете новую переменную внутри блока, она будет существовать только во время выполнения операторов этого блока. Когда поток выполнения покидает блок, такая переменная уничтожается. Это значит, что переменная известна только внутри блока.
#include < iostream> int main() { int x = 20; { // начало блока int у = 100; cout < < x < < endl; // нормально cout < < у < < endl; // нормально } // конец блока cout < < x < < endl; // нормально cout < < у < < endl; // ошибка! return 0; }
Как вы уже видели, блок позволяет помещать два и более оператора там, где синтаксис C++ разрешает лишь один. Операция запятой (, ) делает то же самое с выражениями, позволяя вставлять два выражения туда, где синтаксис C++ допускает только одно. ++j, —i // два выражения воспринимаются как одно // для удовлетворения требований синтаксиса Запятая — это не всегда операция. Например, запятая в следующем объявлении служит для разделения имен в списке объявляемых переменных: int i, j; //здесь запятая — разделитель, а не операция
#include < iostream> #include < string> int main() { using namespace std; cout < < " Enter a word: "; string word; cin > > word; // physically modify string object char temp; int i, j; for (j = 0, i = word.size() - 1; j < i; --i, ++j) { // start block temp = word[i]; word[i] = word[j]; word[j] = temp; } // end block cout < < word < < " \nDone\n";
getchar(); getchar(); return 0; }
Выражения отношений Компьютеры — это нечто большее, чем неутомимые обработчики чисел. Они также умеют сравнивать значения, и эта их способность лежит в основе автоматического принятия решений. В C++ эту возможность реализуют операции отношений. В C++ доступны шесть операций отношений для сравнения чисел. Поскольку символы представлены своими ASCII-кодами, эти операции можно также применять и для сравнения символов. Они не работают со строками в стиле С, но работают с объектами класса string. Каждое сравнивающее выражение возвращает булевское (типа bool) значение true, если сравнение истинно, и false — в противном случае, поэтому данные операции хорошо подходят для применения в проверочных условиях циклов. (Старые реализации оценивали истинные выражения как 1 и ложные — как 0.) Этими шестью операциями отношений исчерпываются все возможности, предусмотренные в C++ для сравнения чисел.
Цикл while Цикл while - это цикл for, у которого удалены инициализирующая и обновляющая части; в нем имеется только проверочное условие и тело: while (проверочное_условие) тело
Сначала программа вычисляет выражение проверочное_условие в скобках. Если выражение дает в результате true, программа выполняет оператор (или операторы), содержащийся в теле цикла. Как и в случае с циклом for, тело состоит из единственного оператора либо блока, определенного фигурными скобками. После того, как завершено выполнение тела, программа возвращается к проверочному условию и заново вычисляет его. Если условие возвращает ненулевое значение, программа снова выполняет тело. Этот цикл проверки и выполнения продолжается до тех пор, пока проверочное условие не вернет false. Если вы хотите в конечном итоге прервать цикл, то в теле цикла должно происходить нечто такое, что повлияет на выражение проверочного условия. Например, цикл может увеличивать значение переменной, используемой в проверочном условии, либо читать новое значение, вводимое с клавиатуры. Подобно for, цикл while является циклом с входным условием. То есть, если проверочное условие оценивается как false в самом начале, то программа ни разу не выполнит тело цикла.
В листинге представлен пример работы цикла while. Цикл проходит по всем символам строки и отображает их ASCII-коды. По достижении нулевого символа цикл завершается. Эта техника прохода по символам строки до нулевого ограничителя является стандартным методом обработки строк в C++. Поскольку строка содержит маркер конца, программа часто не нуждается в явной информации о длине строки.
#include < iostream> const int ArSize = 20; int main() { using namespace std; char name[ArSize];
cout < < " Your first name, please: "; cin > > name; cout < < " Here is your name, verticalized and ASCIIized: \n"; int i = 0; // start at beginning of string while (name[i]! = '\0') { cout < < name[i] < < ": " < < int(name[i]); cout < < endl; i++; // don't forget this step }
getchar(); getchar(); return 0; } |
Последнее изменение этой страницы: 2019-04-09; Просмотров: 68; Нарушение авторского права страницы