Spec-Zone.ru › C++

Операторы

Операторы — это фрагменты программы на 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)
  • Операторы-объявления
  • Блоки try
  • Атомарные и синхронизированные блоки
(TM TS)

Помеченные операторы

Помеченный оператор присваивает оператору метку для управления потоком выполнения.

label statement
label - метка, присваиваемая оператору (определена ниже)
statement - оператор, которому присваивается метка; сам он может быть помеченным оператором, что позволяет использовать несколько меток

Метки

label определяется следующим образом:

attr (необязательно) identifier : (1)
attr (необязательно) case constexpr : (2)
attr (необязательно) default: (3)
1) цель для goto (метка-идентификатор);
2) метка case в операторе switch;
3) метка default в операторе switch.

Две метки-идентификатора в одной функции не должны иметь одинаковый 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 обработчика исключений.
  • Все подоператоры оператора constexpr if.
(начиная с C++17)
  • Все подоператоры оператора consteval if.
(начиная с 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 ) 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) range-decl : range-init ) statement
(4) (начиная с C++11)
1) цикл while;
2) цикл do-while;
3) цикл for;
4) цикл range-for.

Операторы раскрытия

Оператор раскрытия заменяет некоторый код несколькими его копиями.

attr (необязательно) template for
( init-statement (необязательно) expand-decl : expand-init ) compound-statement
1) раскрытие template for.
(начиная с C++26)

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

Оператор перехода безусловно передаёт управление в другое место.

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

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

Операторы утверждения

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

contract_assert attr (необязательно) ( predicate ) ;
1) оператор contract_assert.
(начиная с C++26)

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

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

block-declaration (1)
1) Подробнее см. разделы Объявления и Инициализация.

Блоки try

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

attr (необязательно) try compound-statement handler-sequence (1)
1) Подробнее см. раздел блок try.

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

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

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)

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

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

  • Для помеченного оператора — его statement .
  • Для составного оператора — любой оператор из его statement... .
  • Для оператора выбора — любой из его statement  или compound-statement (начиная с C++23).
  • Для оператора итерации — его statement .
  • Для оператора раскрытия — его compound-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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API