- •Циклы Цикл for
- •Части цикла for
- •Выражения и операторы
- •Не выражения и операторы
- •Отклонения от правил
- •Изменение шага цикла
- •Доступ внутрь строк с помощью цикла for
- •Операции инкремента и декремента
- •Комбинация операций присваивания
- •Составные операторы, или блоки
- •Выражения отношений
- •Цикл while
- •Сравнение циклов for и while
- •Цикл do while
Комбинация операций присваивания
В листинге выше используется следующее выражение для обновления счетчика цикла:
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;
}