1.6. Инструкции. Условные операторы. Циклы

Как вы уже видели в предыдущих частях выполнение программы на C++ состоит из последовательных инстркций. Инструкции выполняются одна за другой. Тем не менее, несмотря на это, при определенных оптимизациях компилятор может попытаться съоптимизировать выполнение инстуркций и приведенный ниже пример не рекомендуется использовать на практике:

#include <iostream>
using namespace std;

int main()
{
    int i = 10; 
    i = ( i += 5) + ( i * 4);
    cout << "i is " << i << endl; // 75
    return 0;
}

Вложенная видимость

Можно объявлять блоки (с помощью фигурных скобок) и в них объявлять переменные с уже сипользованным именем. В этом случае все манимпуляции с “новой” переменной никак не повлияют на переменную вне блока:

#include <iostream>
using namespace std;

int main()
{
    int i = 2;
    int k = 10; 
    { 
	    int k = 5 * i ; // не видна за пределами блока 
	    i = ( k += 5) + 5; 
    }
    
    k = k + 1; 
    cout << k << i << endl;

    return 0;
}

Условные операторы ветвления if/else

Самыми простыми условными ветвлениями в языке С++ являются стейтменты if/else. Они выглядят следующим образом:

if (выражение) {
    // ...
} else {
    // ...
}

При определенных сценаряих можно написать и проверку в else, но злоупотребять этим не стоит, так как код превразается не сильно читаемым (спагетти):

int d = b * b - 4 * a * c ; 
if (d > 0) { 
    roots = 2; 
} else if (d == 0){ 
    roots = 1; 
} else { 
    roots = 0; 
}

С++ предоставляет специальных тернарный оператор (? :), который может упростить выражение сверху (оставив функционал прежним):

int roots = 0; 
if (d >= 0)
	roots = ( d > 0 ) ? 2 : 1;

Циклы for, while

Основным циклом в “классическом” C++ является цикл for. Общая его сигнатура следующая:

for (объявление переменных; условие; инкремент/декремент счетчика) {
    тело цикла;
}

Например следующая инструкция считает сумму квадратов от 0 до 10 (не включительно)

for (int k = 0; k < 10; k++) { 
	squares += k * k; 
}

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

int squares = 0; 
int k = 0; 
while ( k < 10 ) { 
	squares += k * k; 
	k = k + 1; 
} 

Цикл do-while

Цикл do-while отличается от цикла while тем, что он гарантирует выполнение одного прогона, если даже условие в while уже не выполняется. В качестве примера рассмотрите следующие выражения:

int i = 10; 
int sum = 0; 
while (i < 10) { 
    sum += i; 
} 
// sum = 0 
int i = 10; 
int sum = 0; 
do { 
    sum += i; 
} while(i < 10); 
// sum = 10