Операторы
Операторы — это фрагменты программы на C++, которые выполняются последовательно. Тело любой функции представляет собой последовательность операторов. Например:
int main()
{
int n = 1; // declaration statement
n = n + 1; // expression statement
std::cout << "n = " << n << '\n'; // expression statement
return 0; // return statement
}
C++ включает следующие типы операторов:
| (начиная с C++26) |
| (начиная с C++26) |
| (TM TS) |
Помеченные операторы
Помеченный оператор присваивает оператору метку для управления потоком выполнения.
| label statement |
| label | - | метка, присваиваемая оператору (определена ниже) |
| statement | - | оператор, которому присваивается метка; сам он может быть помеченным оператором, что позволяет использовать несколько меток |
Метки
label определяется следующим образом:
attr (необязательно) identifier : | (1) | |
attr (необязательно) case constexpr : | (2) | |
attr (необязательно) default: | (3) |
Две метки-идентификатора в одной функции не должны иметь одинаковый identifier . Поиск identifier в метках не выполняется с помощью неквалифицированного поиска: имя метки может совпадать с именем любой другой сущности в программе.
Метки case и default должны быть заключены в операторы switch.
| Последовательность атрибутов attr может располагаться только в начале метки (в этом случае она применяется к метке) либо непосредственно перед самим оператором, и тогда она применяется ко всему оператору. | (начиная с C++11) |
| Метки можно добавлять не только к операторам, но и размещать в любом месте составных операторов. | (начиная с C++23) |
| Метки-идентификаторы не должны быть заключены в операторы раскрытия. | (начиная с C++26) |
void f()
{
label1: 1 + 1; // a labeled statement
label1: 1 - 1; // Error: cannot repeat label identifiers in the same function
label2: // label can appear at the end of a block standalone since C++23
}
Операторы с ограниченным потоком управления
Следующие операторы являются операторами с ограниченным потоком управления :
- compound-statement блока try.
- compound-statement обработчика исключений.
| (начиная с C++17) |
| (начиная с C++23) |
Для каждого оператора с ограниченным потоком управления S:
- На все объявленные в
Sметки — цели goto могут ссылаться только операторы изS. - Каждая метка case или default, появляющаяся в
S, может быть связана только с оператором switch внутриS.
Операторы-выражения
Оператор-выражение — это выражение, за которым следует точка с запятой.
attr (необязательно) expression (необязательно) ; |
| attr | - | (начиная с C++11) необязательная последовательность из любого количества атрибутов |
| expression | - | выражение |
Большинство операторов в типичной программе на C++ являются операторами-выражениями, например присваиваниями или вызовами функций.
Оператор-выражение без выражения называется пустым оператором. Его часто используют, чтобы задать пустое тело цикла for или while. Его также можно использовать, чтобы разместить метку в конце составного оператора.(до C++23)
Составные операторы
Составной оператор, или блок, объединяет последовательность операторов в один оператор.
attr (необязательно) { statement... (необязательно) label... (необязательно)(начиная с C++23) } |
Когда требуется один оператор, но необходимо последовательно выполнить несколько операторов (например, в операторе if или цикле), можно использовать составной оператор:
if (x > 5) // start of if statement
{ // start of block
int n = 1; // declaration statement
std::cout << n; // expression statement
} // end of block, end of if statement
Каждый составной оператор вводит собственную область видимости блока; переменные, объявленные внутри блока, уничтожаются при закрывающей фигурной скобке в обратном порядке:
int main()
{ // start of outer block
{ // start of inner block
std::ofstream f("test.txt"); // declaration statement
f << "abc\n"; // expression statement
} // end of inner block, f is flushed and closed
std::ifstream f("test.txt"); // declaration statement
std::string str; // declaration statement
f >> str; // expression statement
} // end of outer block, str is destroyed, f is closed
| Если метка находится в конце составного оператора, считается, что за ней следует пустой оператор. | (начиная с C++23) |
Операторы выбора
Оператор выбора выбирает один из нескольких вариантов потока управления.
attr (необязательно) if constexpr(необязательно) ( init-statement (необязательно) condition ) statement | (1) | |
attr (необязательно) if constexpr(необязательно) ( init-statement (необязательно) condition ) statementelse statement | (2) | |
attr (необязательно) switch ( init-statement (необязательно) condition ) statement | (3) | |
attr (необязательно) if !(необязательно) consteval compound-statement | (4) | (начиная с C++23) |
attr (необязательно) if !(необязательно) consteval compound-statement else statement | (5) | (начиная с C++23) |
Операторы итерации
Оператор итерации многократно выполняет код.
attr (необязательно) while ( condition ) statement | (1) | |
attr (необязательно) do statement while ( expression ) ; | (2) | |
attr (необязательно) for ( init-statement condition (необязательно) ; expression (необязательно) ) statement | (3) | |
attr (необязательно) for( init-statement (необязательно)(начиная с C++20) range-decl : range-init ) statement | (4) | (начиная с C++11) |
Операторы раскрытияОператор раскрытия заменяет некоторый код несколькими его копиями.
| (начиная с C++26) |
Операторы перехода
Оператор перехода безусловно передаёт управление в другое место.
attr (необязательно) break; | (1) | |
attr (необязательно) continue; | (2) | |
attr (необязательно) return expression (необязательно) ; | (3) | |
attr (необязательно) return braced-init-list ; | (4) | (начиная с C++11) |
attr (необязательно) goto identifier ; | (5) |
Примечание: для всех операторов перехода переход из цикла, из блока или обратно через инициализированную переменную с автоматической длительностью хранения приводит к уничтожению объектов с автоматической длительностью хранения, находящихся в области видимости в точке перехода, но не в точке назначения. Если было инициализировано несколько объектов, порядок их уничтожения противоположен порядку инициализации.
Операторы утвержденияУтверждение контракта.
| (начиная с C++26) |
Операторы-объявления
Оператор-объявление вводит один или несколько идентификаторов в блок.
| block-declaration | (1) |
Блоки try
Блок try перехватывает исключения, выброшенные при выполнении других операторов.
attr (необязательно) try compound-statement handler-sequence | (1) |
Атомарные и синхронизированные блокиАтомарный и синхронизированный блоки обеспечивают транзакционную память.
| (TM TS) |
Подоператоры
Подоператором оператора является один из следующих элементов:
- Для помеченного оператора — его statement .
- Для составного оператора — любой оператор из его statement... .
- Для оператора выбора — любой из его statement или compound-statement (начиная с C++23).
- Для оператора итерации — его statement .
| (начиная с C++26) |
Оператор S1 заключает в себе оператор S2, если выполняется любое из следующих условий:
-
S2является подоператоромS1 -
S1является оператором выбора, оператором раскрытия(начиная с C++26) или оператором итерации, аS2— это init-statement оператораS1. -
S1является блоком try, аS2является либо его compound-statement, либо compound-statement любого обработчика в его handler-seq . -
S1заключает в себе операторS3, аS3заключает в себеS2.
Оператор S1 заключён в оператор S2, если S2 заключает в себе S1.
См. также
| Документация по C по теме Операторы |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/statements