Операторы
Операторы — фрагменты программы 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
Существует пять типов операторов:
| Последовательность спецификаторов атрибутов (attr-spec-seq) может быть применена к неименованному оператору, в этом случае (кроме оператора выражения) атрибуты применяются к соответствующему оператору. | (с C23) |
Метки
Любой оператор может быть меченым, с помощью имени, за которым следует двоеточие перед самим оператором.
attr-spec-seq(необязательно)(с C23) identifier : | (1) | |
attr-spec-seq(необязательно)(с C23) case constant-expression : | (2) | |
attr-spec-seq(необязательно)(с C23) default : | (3) |
Любой оператор (но не объявление) может быть предваряем любым количеством меток, каждая из которых объявляет 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) |
Операторы циклов
Операторы циклов многократно выполняют оператор.
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) |
Операторы перехода
Операторы перехода безусловно передают поток управления.
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) |
Справочные материалы
- Стандарт 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