Spec-Zone.ru › C

Операторы

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

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    n = n+1; // expression statement
    printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body


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

1) составные операторы
2) операторы выражений
3) операторы выбора
4) операторы циклов
5) операторы перехода

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

(с 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) Метка default в операторе switch.

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

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

Метка должна быть после оператора.

(до C23)

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

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

(с C23)

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

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

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

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

if (expr) // start of if-statement
{ // start of block
  int n = 1; // declaration
  printf("%d\n", n); // expression statement
} // end of block, end of if-statement

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

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

int main(void)
{ // start of block
  { // start of block
       puts("hello"); // expression statement
       int n = printf("abc\n"); // declaration, prints "abc", stores 4 in n
       int a[n*printf("1\n")]; // declaration, prints "1", allocates 8*sizeof(int)
       printf("%zu\n", sizeof(a)); // expression statement
  } // end of block, scope of n and a ends
  int n = 7; // n can be reused
}

Операторы выражений

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

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

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

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

puts("hello"); // expression statement
char *s;
while (*s++ != '\0')
    ; // null statement

Необязательная 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

Справочные материалы

  • Стандарт 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 ОПЕРАТОРЫ

См. также

Документация C++ по Операторам

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/statements

Spec-Zone.ru

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