Statements
Операторы — это фрагменты программы на C++, которые выполняются последовательно. Тело любой функции представляет собой последовательность операторов. Например:
int main() { int n = 1; // оператор объявления n = n + 1; // оператор выражения std::cout << "n = " << n << '\n'; // оператор выражения return 0; // оператор возврата }
C++ включает следующие типы операторов:
- Помеченные операторы
- Операторы выражений
- Составные операторы
- Условные операторы
- Циклические операторы
- Операторы перехода
| (начиная с C++26) |
| (TM TS) |
Содержание |
Помеченные операторы
Помеченная инструкция (labeled statement) обозначает инструкцию для целей управления потоком выполнения.
| оператор метки | |||||||||
| label | - | метка, применяемая к оператору (определена ниже) |
| statement | - | оператор, к которому применяется метка; может быть сам помеченным оператором, что позволяет использовать несколько меток |
Метки
label определяется как
attr
(необязательно)
identifier
:
|
(1) | ||||||||
attr
(необязательно)
case
constexpr
:
|
(2) | ||||||||
attr
(необязательно)
default:
|
(3) | ||||||||
|
Последовательность атрибутов attr может появляться либо непосредственно в начале метки (в этом случае она применяется к метке), либо непосредственно перед любым оператором, в этом случае она применяется ко всему оператору. |
(since C++11) |
Метка с идентификатором, объявленным внутри функции, соответствует всем операторам goto с тем же идентификатором в этой функции, во всех вложенных блоках, до и после её собственного объявления.
Две метки в функции не должны иметь одинаковый идентификатор.
|
Помимо добавления к оператору, метки также могут использоваться в любом месте составных операторов . |
(since C++23) |
Метки не обнаруживаются при unqualified lookup : метка может иметь то же имя, что и любая другая сущность в программе.
void f() { { goto label; // метка в области видимости, даже если объявлена позже label: // метка может находиться в конце блока самостоятельно начиная с C++23 } goto label; // метка игнорирует область видимости блока } void g() { goto label; // ошибка: метка не в области видимости в g() }
Операторы с ограниченным потоком управления
Следующие операторы являются операторами с ограниченным потоком управления :
- Составной оператор compound-statement блока try block .
- Составной оператор compound-statement обработчика handler .
|
(since C++17) |
|
(since C++23) |
Для каждого оператора с ограниченным потоком управления
S
:
-
Все
goto
целевые метки, объявленные в
S, могут быть использованы только операторами вS. -
Каждая
case
или
default
метка, появляющаяся внутри
S, может быть связана только с switch оператором внутриS.
Выражения-инструкции
Оператор-выражение представляет собой выражение, за которым следует точка с запятой.
attr
(необязательно)
expression
(необязательно)
;
|
|||||||||
| attr | - | (since C++11) опциональная последовательность любого количества атрибутов |
| expression | - | выражение |
Большинство операторов в типичной программе на C++ являются выражениями, такими как присваивания или вызовы функций.
Инструкция выражения без выражения называется null statement . Она часто используется для предоставления пустого тела циклу for или while . Также может использоваться для размещения метки в конце составной инструкции. (до C++23)
Составные операторы
Составной оператор или блок группирует последовательность операторов в один оператор.
attr
(необязательно)
{
statement...
(необязательно)
label...
(необязательно)
(начиная с C++23)
}
|
|||||||||
Когда ожидается одно выражение, но необходимо выполнить несколько выражений последовательно (например, в if или цикле), может использоваться составной оператор:
if (x > 5) // начало оператора if { // начало блока int n = 1; // оператор объявления std::cout << n; // оператор выражения } // конец блока, конец оператора if
Каждый составной оператор вводит свою собственную область видимости scope ; переменные, объявленные внутри блока, уничтожаются при закрывающей фигурной скобке в обратном порядке:
int main() { // начало внешнего блока { // начало внутреннего блока std::ofstream f("test.txt"); // инструкция объявления f << "abc\n"; // инструкция выражения } // конец внутреннего блока, f сбрасывается и закрывается std::ifstream f("test.txt"); // инструкция объявления std::string str; // инструкция объявления f >> str; // инструкция выражения } // конец внешнего блока, str уничтожается, f закрывается
|
Метка label в конце составного оператора рассматривается так, как если бы за ней следовал пустой оператор. |
(since C++23) |
Операторы выбора
Оператор выбора выбирает один из нескольких потоков управления.
attr
(необязательно)
if constexpr
(необязательно)
(
init-statement
(необязательно)
condition
)
statement
|
(1) | ||||||||
attr
(необязательно)
if constexpr
(необязательно)
(
init-statement
(необязательно)
condition
)
statement
else
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)
for-range-decl
:
for-range-init
)
statement
|
(4) | (начиная с C++11) | |||||||
Операторы перехода
Оператор перехода безусловно передает управление потоком выполнения.
attr
(необязательно)
break;
|
(1) | ||||||||
attr
(необязательно)
continue;
|
(2) | ||||||||
attr
(необязательно)
return
выражение
(необязательно)
;
|
(3) | ||||||||
attr
(необязательно)
return
braced-init-list
;
|
(4) | (начиная с C++11) | |||||||
attr
(необязательно)
goto
идентификатор
;
|
(5) | ||||||||
Примечание: для всех операторов перехода, выход из цикла, из блока или переход назад через инициализированную переменную с автоматической продолжительностью хранения включает уничтожение объектов с автоматической продолжительностью хранения, которые находятся в области видимости в точке перехода откуда, но не в точке перехода куда. Если было инициализировано несколько объектов, порядок уничтожения противоположен порядку инициализации.
УтвержденияКонтрактное утверждение.
1)
contract_assert
инструкция.
|
(начиная с C++26) | |||||||||||||||||||||||
Операторы объявления
Оператор объявления вводит один или несколько идентификаторов в блок.
| block-declaration | (1) | ||||||||
try блоки
Блок try перехватывает исключения, возникающие при выполнении других операторов.
attr
(необязательно)
try
составной-оператор последовательность-обработчиков
|
(1) | ||||||||
Атомарные и синхронизированные блокиАтомарный и синхронизированный блок предоставляет транзакционную память .
1)
синхронизированный блок
, выполняемый в едином общем порядке со всеми синхронизированными блоками;
2)
атомарный блок
, прерывающийся при исключениях;
3)
атомарный блок
, откатывающий изменения при исключениях;
4)
атомарный блок
, фиксирующий изменения при исключениях.
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Подоператоры
Подоператор оператора представляет собой один из следующих элементов:
- Для помеченной инструкции — её statement .
- Для составной инструкции — любая инструкция из её statement... .
- Для инструкции выбора — любая из её statement или compound-statement (since C++23) .
- Для итерационной инструкции — её statement .
Оператор S1 охватывает оператор S2 если выполняется любое из следующих условий:
- S2 является подоператором S1
- S1 является оператором выбора или итерационным оператором, и S2 является init-statement оператора S1 .
- S1 является try блоком , и S2 является либо его compound-statement , либо compound-statement любого обработчика в его handler-seq .
- S1 охватывает оператор S3 и S3 охватывает S2 .
Оператор S1 охватывается оператором S2 если S2 охватывает S1 .
Смотрите также
|
Документация C
для
Statements
|