Namespaces
Variants

Statements

From cppreference.net

Операторы — это фрагменты программы на C, которые выполняются последовательно. Тело любой функции представляет собой составной оператор, который, в свою очередь, является последовательностью операторов и объявлений:

int main(void)
{ // начало составного оператора
    int n = 1; // объявление (не оператор)
    n = n+1; // оператор выражения
    printf("n = %d\n", n); // оператор выражения
    return 0; // оператор возврата
} // конец составного оператора, конец тела функции


Существует пять типов операторов:

Последовательность спецификаторов атрибутов ( attr-spec-seq ) может быть применена к неразмеченному оператору, и в этом случае (за исключением оператора-выражения) атрибуты применяются к соответствующему оператору.

(since C23)

Содержание

Метки

Любое утверждение может быть помечено , путем указания имени, за которым следует двоеточие, перед самим утверждением.

attr-spec-seq (необязательно) (начиная с C23) identifier : (1)
attr-spec-seq (необязательно) (начиная с C23) case constant-expression : (2)
attr-spec-seq (необязательно) (начиная с C23) default : (3)
1) Цель для goto .
2) Метка case в switch операторе.
3) Метка по умолчанию в switch операторе.

Любое утверждение (но не объявление) может предваряться любым количеством labels , каждый из которых объявляет identifier именем метки, которое должно быть уникальным в пределах охватывающей функции (другими словами, имена меток имеют function scope ).

Объявление метки само по себе не имеет эффекта, не изменяет поток управления и никак не влияет на поведение следующего за ним оператора.

Метка должна сопровождаться оператором.

(until C23)

Метка может появляться без последующего оператора. Если метка появляется одна в блоке, она ведет себя так, как если бы за ней следовал пустой оператор .

Необязательная attr-spec-seq применяется к метке.

(since C23)

Составные операторы

Составной оператор, или блок , представляет собой заключенную в фигурные скобки последовательность операторов и объявлений.

{ statement | declaration ... (необязательно) } (до C23)
attr-spec-seq (необязательно) { unlabeled-statement | label | declaration ... (необязательно) } (начиная с C23)

Составной оператор позволяет группировать набор объявлений и операторов в единый блок, который может использоваться везде, где ожидается одиночный оператор (например, в if операторе или операторе цикла):

if (expr) // начало if-оператора
{ // начало блока
  int n = 1; // объявление
  printf("%d\n", n); // оператор выражения
} // конец блока, конец if-оператора

Каждый составной оператор вводит свою собственную область видимости блока .

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

int main(void)
{ // начало блока
  { // начало блока
       puts("hello"); // выражение-оператор
       int n = printf("abc\n"); // объявление, выводит "abc", сохраняет 4 в n
       int a[n*printf("1\n")]; // объявление, выводит "1", выделяет 8*sizeof(int)
       printf("%zu\n", sizeof(a)); // выражение-оператор
  } // конец блока, область видимости n и a завершается
  int n = 7; // n может быть переиспользована
}

Выражения-инструкции

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

expression (необязательно) ; (1)
attr-spec-seq expression ; (2) (начиная с C23)

Большинство операторов в типичной программе на C являются выражениями, такими как присваивания или вызовы функций.

Инструкция выражения без выражения называется null statement . Она часто используется для предоставления пустого тела циклу for или while . Также может использоваться для размещения метки в конце составной инструкции или перед объявлением:

puts("hello"); // выражение-оператор
char *s;
while (*s++ != '\0')
    ; // пустой оператор

Необязательная attr-spec-seq применяется к выражению.

attr-spec-seq за которой следует ; не формирует выражение-оператор. Вместо этого она формирует объявление атрибутов .

(начиная с C23)

Операторы выбора

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

attr-spec-seq (необязательно) (начиная с C23) if ( expression ) statement (1)
attr-spec-seq (необязательно) (начиная с C23) if ( expression ) statement else statement (2)
attr-spec-seq (необязательно) (начиная с C23) switch ( expression ) statement (3)
1) if инструкция
2) if оператор с предложением else
3) switch оператор

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

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

attr-spec-seq (необязательно) (начиная с C23) while ( expression ) statement (1)
attr-spec-seq (необязательно) (начиная с C23) do statement while ( expression ) ; (2)
attr-spec-seq (необязательно) (начиная с C23) for ( init-clause ; expression (необязательно) ; expression (необязательно) ) statement (3)
1) while цикл
2) do-while цикл
3) for цикл

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

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

attr-spec-seq (необязательно) (начиная с C23) break ; (1)
attr-spec-seq (необязательно) (начиная с C23) continue ; (2)
attr-spec-seq (необязательно) (начиная с C23) return expression (необязательно) ; (3)
attr-spec-seq (необязательно) (начиная с C23) goto identifier ; (4)
1) break оператор
2) continue оператор
3) return оператор с необязательным выражением
4) goto оператор

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 6.8 Операторы и блоки (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.8 Операторы и блоки (стр: 106-112)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.8 Операторы и блоки (стр: 146-154)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.8 Операторы и блоки (стр: 131-139)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.6 STATEMENTS

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

C++ documentation для Statements