Statements
Операторы — это фрагменты программы на 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) | ||||||||
Любое утверждение (но не объявление) может предваряться любым количеством 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) | ||||||||
Операторы итерации
Операторы итерации многократно выполняют оператор.
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) | ||||||||
Ссылки
- Стандарт 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
|