На этом уроке мы рассмотрим блоки стейтментов в языке С++.
Блоки стейтментов
Блоки стейтментов (или «составные операторы») — это группа стейтментов, которые обрабатываются компилятором как одна инструкция. Блок начинается с символа {
и заканчивается символом }
, стейтменты находятся внутри. Блоки могут использоваться в любом месте, где разрешено использовать один стейтмент. В конце составного оператора точка с запятой не ставится.
Вы уже видели пример блоков при написании функций, поскольку тело функции является блоком:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int add(int x, int y) { // начало блока return x + y; } // конец блока int main() { // начало блока // Несколько стейтментов int value(0); add(3, 4); return 0; } // конец блока (без точки с запятой) |
Вложенные блоки
Хотя функции не могут быть вложены в другие функции, блоки могут быть вложены в другие блоки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int add(int x, int y) { // начало блока return x + y; } // конец блока int main() { // начало внешнего блока // Несколько стейтментов int value {}; { // начало внутреннего/вложенного блока add(3, 4); } // конец внутреннего/вложенного блока return 0; } // конец внешнего блока |
При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренний/вложенный блок.
Блоки и операторы if
Один из наиболее распространенных вариантов использования блоков связан с операторами if. По умолчанию оператор if выполняет один стейтмент, если условие имеет значение true
. С помощью блока мы можем сделать так, чтобы выполнялось сразу несколько стейтментов, если условие имеет значение true
, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> int main() { std::cout << "Enter an integer: "; int value; std::cin >> value; if (value >= 0) { // начало вложенного блока std::cout << value << " is a positive integer (or zero)" << std::endl; std::cout << "Double this number is " << value * 2 << std::endl; } // конец вложенного блока else { // начало другого вложенного блока std::cout << value << " is a negative integer" << std::endl; std::cout << "The positive of this number is " << -value << std::endl; } // конец другого вложенного блока return 0; } |
Если ввести число 3
, то программа выведет:
Enter an integer: 3
3 is a positive integer (or zero)
Double this number is 6
Если ввести число -4
, то программа выведет:
Enter an integer: -4
-4 is a negative integer
The positive of this number is 4
Количество уровней вложенности блоков
Можно даже размещать вложенные блоки внутри других вложенных блоков:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> int main() { // 1-й уровень вложенности блоков std::cout << "Enter an integer: "; int value {}; std::cin >> value; if (value > 0) { // 2-й уровень вложенности блоков if ((value % 2) == 0) { // 3-й уровень вложенности блоков std::cout << value << " is positive and even\n"; } else { // также 3-й уровень вложенности блоков std::cout << value << " is positive and odd\n"; } } return 0; } |
Уровень вложенности функции (или «глубина вложенности функции») — это максимальное количество блоков, которые могут находиться в любой точке функции (включая внешний блок). В вышеприведенной функции main() есть 4 блока, но уровень вложенности равен 3.
По факту, ограничений на количество вложенных блоков нет. Однако не рекомендуется делать больше 3 уровней вложенности (максимум 4). Если ваша функция нуждается в большем количестве уровней вложенности, то эту функцию лучше разбить на несколько подфункций!
Заключение
Блоки стейтментов позволяют выполнить сразу несколько стейтментов там, где можно использовать лишь один. Они чрезвычайно полезны, когда нужно выполнить сразу несколько инструкций вместе.
Хотелось бы ещё осветить смысл символа ; после оператора.
И его тонкости, например, почему if(cond) expr1; else expr2; будет ошибкой.
Как будь-то если написать
без этих скобок — ничего не заработает..
Заработать-то заработает, да вот только не так, как хотел бы программист.
Дело совсем не в том, что "а вот только не так, как хотел бы программист".
Тут легко запутаться при случаи большой проги.
Скажем таких блоков 500, вложены по 3-4.
Догадайся, что это скобка закрывает. Не догадаешься, писать надо в один ряд их.