From 754bbf7a25a8dda49b5d08ef0d0443bbf5af0e36 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 7 Apr 2024 13:41:34 -0500 Subject: new repository --- devdocs/c/language%2Fstatements.html | 113 +++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 devdocs/c/language%2Fstatements.html (limited to 'devdocs/c/language%2Fstatements.html') diff --git a/devdocs/c/language%2Fstatements.html b/devdocs/c/language%2Fstatements.html new file mode 100644 index 00000000..09713f6a --- /dev/null +++ b/devdocs/c/language%2Fstatements.html @@ -0,0 +1,113 @@ +

Statements

Statements are fragments of the C program that are executed in sequence. The body of any function is a compound statement, which, in turn is a sequence of statements and declarations:

+
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


There are five types of statements:

+
+1) compound statements +
+2) expression statements +
+3) selection statements +
+4) iteration statements +
+5) jump statements +
+ +

An attribute specifier sequence (attr-spec-seq) can be applied to an unlabeled statement, in which case (except for an expression statement) the attributes are applied to the respective statement.

+
(since C23)

Labels

Any statement can be labeled, by providing a name followed by a colon before the statement itself.

+ + + + +
attr-spec-seq(optional)(since C23) identifier : (1)
attr-spec-seq(optional)(since C23) case constant-expression : (2)
attr-spec-seq(optional)(since C23) default : (3)
+1) Target for goto.
+2) Case label in a switch statement.
+3) Default label in a switch statement.

Any statement (but not a declaration) may be preceded by any number of labels, each of which declares identifier to be a label name, which must be unique within the enclosing function (in other words, label names have function scope).

+

Label declaration has no effect on its own, does not alter the flow of control, or modify the behavior of the statement that follows in any way.

+ + + + +

A label shall be followed by a statement.

+
(until C23)

A label can appear without its following statement. If a label appears alone in a block, it behaves as if it is followed by a null statement.

+

The optional attr-spec-seq is applied to the label.

+
(since C23)

Compound statements

A compound statement, or block, is a brace-enclosed sequence of statements and declarations.

+ + + +
{ statement | declaration...(optional) } (until C23)
attr-spec-seq(optional) { unlabeled-statement | label | declaration...(optional) } (since C23)

The compound statement allows a set of declarations and statements to be grouped into one unit that can be used anywhere a single statement is expected (for example, in an if statement or an iteration statement):

+
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

Each compound statement introduces its own block scope.

+

The initializers of the variables with automatic storage duration declared inside a block and the VLA declarators are executed when flow of control passes over these declarations in order, as if they were statements:

+
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 statements

An expression followed by a semicolon is a statement.

+ + + +
expression(optional) ; (1)
attr-spec-seq expression ; (2) (since C23)

Most statements in a typical C program are expression statements, such as assignments or function calls.

+

An expression statement without an expression is called a null statement. It is often used to provide an empty body to a for or while loop. It can also be used to carry a label in the end of a compound statement or before a declaration:

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

The optional attr-spec-seq is applied to the expression.

+

An attr-spec-seq followed by ; does not form an expression statement. It forms an attribute declaration instead.

+
(since C23)

Selection statements

The selection statements choose between one of several statements depending on the value of an expression.

+ + + + +
attr-spec-seq(optional)(since C23) if ( expression ) statement (1)
attr-spec-seq(optional)(since C23) if ( expression ) statement else statement (2)
attr-spec-seq(optional)(since C23) switch ( expression ) statement (3)
+1) if statement
+2) if statement with an else clause
+3) switch statement

Iteration statements

The iteration statements repeatedly execute a statement.

+ + + + +
attr-spec-seq(optional)(since C23) while ( expression ) statement (1)
attr-spec-seq(optional)(since C23) do statement while ( expression ) ; (2)
attr-spec-seq(optional)(since C23) for ( init-clause ; expression(optional) ; expression(optional) ) statement (3)
+1) while loop
+2) do-while loop
+3) for loop

Jump statements

The jump statements unconditionally transfer flow control.

+ + + + + +
attr-spec-seq(optional)(since C23) break ; (1)
attr-spec-seq(optional)(since C23) continue ; (2)
attr-spec-seq(optional)(since C23) return expression(optional) ; (3)
attr-spec-seq(optional)(since C23) goto identifier ; (4)
+1) break statement
+2) continue statement
+3) return statement with an optional expression
+4) goto statement

References

See also

+
C++ documentation for Statements
+

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

+
-- cgit v1.2.3