Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Циклы.docx
Скачиваний:
2
Добавлен:
22.11.2019
Размер:
1.57 Mб
Скачать

Комбинация операций присваивания

В листинге выше используется следующее выражение для обновления счетчика цикла:

i = i + by

В C++ предусмотрена комбинированная операция сложения с присваиванием, ко­торая позволяет получить тот же результат, но более кратко:

i += by

Операция += складывает значение своих двух операндов и присваивает резуль­тат левому операнду. Это предполагает, что левый операнд должен быть чем-то таким, чему можно присваивать значения, вроде переменной, элемента массива, члена структуры либо элемента данных, полученного через разыменование указателя:

Каждая арифметическая операция имеет соответствующую операцию присваи­вания, как показано в таблице. Каждая такая операция работает аналогично +=. То есть, например, следующий оператор заменяет текущее значение к в 10 раз большим значением: x *= 10;

Составные операторы, или блоки

Формат - или синтаксис - написания оператора 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;

}