Namespaces
Variants

Statements

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Операторы — это фрагменты программы на 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)
1) цель для goto ;
2) case метка в switch инструкции;
3) default метка в switch операторе.

Последовательность атрибутов 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)
1) if инструкция;
2) if инструкция с предложением else;
3) switch оператор;
4) consteval if инструкция;
5) consteval if инструкция с предложением else.

Операторы итерации

Оператор итерации многократно выполняет некоторый код.

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)
1) while цикл;
2) do-while цикл;
3) for цикл;
4) range for цикл.

Операторы перехода

Оператор перехода безусловно передает управление потоком выполнения.

attr  (необязательно) break; (1)
attr  (необязательно) continue; (2)
attr  (необязательно) return выражение  (необязательно) ; (3)
attr  (необязательно) return braced-init-list ; (4) (начиная с C++11)
attr  (необязательно) goto идентификатор ; (5)
1) break statement;
2) continue statement;
3) return инструкция с необязательным выражением;
4) return инструкция с использованием list initialization ;
5) goto инструкция.

Примечание: для всех операторов перехода, выход из цикла, из блока или переход назад через инициализированную переменную с автоматической продолжительностью хранения включает уничтожение объектов с автоматической продолжительностью хранения, которые находятся в области видимости в точке перехода откуда, но не в точке перехода куда. Если было инициализировано несколько объектов, порядок уничтожения противоположен порядку инициализации.

Утверждения

Контрактное утверждение.

contract_assert attr  (опционально) ( predicate ) ;
1) contract_assert инструкция.
(начиная с C++26)

Операторы объявления

Оператор объявления вводит один или несколько идентификаторов в блок.

block-declaration (1)
**Примечание:** В данном фрагменте HTML нет текста для перевода, кроме термина "block-declaration", который является C++ специфическим термином и не подлежит переводу согласно инструкциям. Число "(1)" также не требует перевода.
1) См. Declarations и Initialization для подробностей.

try блоки

Блок try перехватывает исключения, возникающие при выполнении других операторов.

attr  (необязательно) try составной-оператор последовательность-обработчиков (1)
1) См. try block для подробностей.


Атомарные и синхронизированные блоки

Атомарный и синхронизированный блок предоставляет транзакционную память .

synchronized compound-statement (1) (TM TS)
atomic_noexcept compound-statement (2) (TM TS)
atomic_cancel compound-statement (3) (TM TS)
atomic_commit compound-statement (4) (TM TS)
1) синхронизированный блок , выполняемый в едином общем порядке со всеми синхронизированными блоками;
2) атомарный блок , прерывающийся при исключениях;
3) атомарный блок , откатывающий изменения при исключениях;
4) атомарный блок , фиксирующий изменения при исключениях.
(TM TS)

Подоператоры

Подоператор оператора представляет собой один из следующих элементов:

Оператор 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 .

Смотрите также