Control flow

Short description: How software progresses through its implementation

Not to be confused with Flow control (data).

Loop constructs

* Do while loop
* While loop
* For loop
* Foreach loop
* Infinite loop
* Control flow

* v
* t
* e

In software, control flow (or flow of control) describes how execution progresses from one command to the next. In many contexts, such as machine code and an imperative programming language, control progresses sequentially (to the command located immediately after the currently executing command) except when a command transfers control to another point – in which case the command is classified as a control flow command. Depending on context, other terms are used instead of command. For example, in machine code, the typical term is instruction and in an imperative language, the typical term is statement.

Although an imperative language encodes control flow explicitly, languages of other programming paradigms are less focused on control flow. A declarative language specifies desired results without prescribing an order of operations. A functional language uses both language constructs and functions to control flow even though they are usually not called control flow statements.

For a central processing unit (CPU) instruction set, a control flow instruction often alters the program counter and is either an unconditional branch (a.k.a. jump) or a conditional branch. An alternative approach is predication which conditionally enables instructions instead of branching.

An asynchronous control flow transfer such as an interrupt or a signal alters the normal flow of control to a hander before returning control to where it was interrupted.

One way to attack software is to redirect the flow of execution. A variety of control-flow integrity techniques, including stack canaries, buffer overflow protection, shadow stacks, and vtable pointer verification, are used to defend against these attacks.[1][2][3]

## Contents

* 1 Structure
* 1.1 Sequence
* 1.2 Label
* 1.3 Block
* 2 Control
* 2.1 Function
* 2.2 Branch
* 2.2.1 Jump
* 2.2.2 Conditional branch
* 2.2.3 Multiway branch
* 2.3 Loop
* 2.3.1 Numeric
* 2.3.2 Condition-controlled
* 2.3.3 Enumeration
* 2.3.4 Infinite
* 2.3.5 Loop-and-a-half problem
* 2.3.6 Unstructured
* 2.3.6.1 Early exit
* 2.3.6.1.1 Multi-level breaks
* 2.3.6.2 Middle test
* 2.3.7 Loop variants and invariants
* 2.3.8 Loop sublanguage
* 2.3.9 Loop system cross-reference table
* 2.4 Non-local
* 2.4.1 Condition handling
* 2.4.2 Exception handling
* 2.4.3 Continuation
* 2.4.4 Generator
* 2.4.5 Coroutine
* 2.4.6 COMEFROM
* 2.4.7 Event-based early exit from nested loop
* 3 See also
* 4 References
* 5 Further reading
* 6 External links

## Structure

Control flow is closely related to code structure. Control flows along lines defined by structure and the execution rules of a language. This general concept of structure is not be confused with structured programming which limits structure to sequencing, selection and iteration based on block organization.

### Sequence

Sequential execution is the most basic structure. Although not all code is sequential in nature, imperative code is.

### Label

A label identifies a position in source code. Some control flow statements reference a label so that control jumps to the labeled line. Other than marking a position, a label has no other effect.

Some languages limit a label to a number which is sometimes called a line number although that implies the inherent index of the line; not a label. None-the-less, such numeric labels are typically required to increment from top to bottom in a file even if not be sequential. For example, in BASIC:

10 LET X = 3
20 PRINT X
30 GOTO 10

In many languages, a label is an alphanumeric identifier, usually appearing at the start of a line and immediately followed by a colon. For example, the following C code defines a label `Success` on line 3 which identifies a jump target point at the first statement that follows it; line 4.

if (ok) goto success;
return;
success:
printf("OK");

### Block

Most languages provide for organizing sequences of code as a block. When used with a control statement, the beginning of a block provides a jump target. For example, in the following C code (which uses curly braces to delimit a block), control jumps from line 1 to 4 if done is false.

if (done) {
printf("All done");
} else {
printf("Still workin' on it");

## Control

Many control commands have been devised for programming languages. This section describes notable constructs; organized by functionality.

### Function

A function provides for control flow in that when called, execution jumps to the start of the function's code and when it completes, control returns the calling point. In the following C code, control jumps from line 6 to 2 in order to call function `foo()`. Then, after completing the function body (printing "Hi"), control returns to after the call, line 7.

void foo() {
printf("Hi");

void bar() {
foo();
printf("Done");

### Branch

A branch command moves the point of execution from the point in the code that contains the command to the point that the command specifies.

#### Jump

A jump command unconditionally branches control to another point in the code, and is the most basic form of controlling the flow of code.

In a high-level language, this is often provided as a goto statement. Although the keyword may be upper or lower case or one or two words depending on the language, it is like: `goto label`. When control reaches a goto statement, control then jumps to the statement that follows the indicated label. The goto statement is been considered harmful by many computer scientists; notably Dijkstra.

#### Conditional branch

A conditional statement jumps control based on the value of a Boolean expression. Common variations include:

if-goto
Jumps to a label based on a condition; a high-level programming statement that closely mimics a similar used machine code instruction

if-then
Rather than being restricted to a jump, a statement or block is executed if the expression is true. In a language that does not include the `then` keyword, this can be called an if statement.

if-then-else
Like if-then, but with a second action to be performed if the condition is false. In a language that does not include the `then` keyword, this can be called an if-else statement.

Nested
Conditional statements are often nested inside other conditional statements.

Arithmetic if
Early Fortran, had an arithmetic if (a.k.a. three-way if) that tests whether a numeric value is negative, zero, or positive. This statement was deemed obsolete in Fortran-90, and deleted as of Fortran 2018.

Functional
Some languages have a functional form; for instance Lisp's `cond`.

Operator
Some languages have an operator form, such as the ternary conditional operator.

When and unless
Perl supplements a C-style `if` with `when` and `unless`.

Messages
Smalltalk uses `ifTrue` and `ifFalse` messages to implement conditionals, rather than a language construct.

The following Pascal code shows a simple if-then-else. The syntax is similar in Ada:

if a > 0 then
writeln("yes")
else
writeln("no");

In C:

if (a > 0) {
puts("yes");
} else {
puts("no");

In bash:

if [ $a -gt 0 ]; then
echo "yes"
else
echo "no"

In Python:

if a > 0:
print("yes")
else:
print("no")

In Lisp:

(princ
(if (plusp a)
"yes"
"no"))

#### Multiway branch

A multiway branch jumps control based on matching values. There is usually a provision for a default action if no match is found. A switch statement can allow compiler optimizations, such as lookup tables. In dynamic languages, the cases may not be limited to constant expressions, and might extend to pattern matching, as in the shell script example on the right, where the `*)` implements the default case as a glob matching any string. Case logic can also be implemented in functional form, as in SQL's `decode` statement.

The following Pascal code shows a relatively simple switch statement. Pascal uses the `case` keyword instead of `switch`.

case someChar of
'a': actionOnA;
'x': actionOnX;
'y','z':actionOnYandZ;
else actionOnNoMatch;
end;

In Ada:

case someChar is
when 'a' => actionOnA;
when 'x' => actionOnX;
when 'y' | 'z' => actionOnYandZ;
when others => actionOnNoMatch;
end;

In C:

switch (someChar) {
case 'a':
actionOnA;
break;
case 'x':
actionOnX;
break;
case 'y':
case 'z':
actionOnYandZ;
break;
default:
actionOnNoMatch;

In Bash:

case $someChar in
a)    actionOnA ;;
x)    actionOnX ;;
[yz]) actionOnYandZ ;;
*)    actionOnNoMatch  ;;
esac

In Lisp:

(case some-char
((#\a)     action-on-a)
((#\x)     action-on-x)
((#\y #\z) action-on-y-and-z)
(else      action-on-no-match))

In Fortran:

select case (someChar)
case ('a')
actionOnA
case ('x')
actionOnX
case ('y','z')
actionOnYandZ
case default
actionOnNoMatch
end select

### Loop

basic types of program loops

A loop is a sequence of statements, loop body, which is executed a number of times based on runtime state. The body is executed once for each item of a collection (definite iteration), until a condition is met (indefinite iteration), or infinitely. A loop inside the loop body is called a nested loop.[4][5][6] Early exit from a loop may be supported via a break statement.[7][8]

In a functional programming language, such as Haskell and Scheme, both recursive and iterative processes are expressed with tail recursive procedures instead of looping constructs that are syntactic.

#### Numeric

Main article: For loop

A relatively simple yet useful loop iterates over a range of numeric values. A simple form starts at an integer value, ends at a larger integer value and iterates for each integer value between. Often, the increment can be any integer value; even negative to loop from a larger to a smaller value.

Example in BASIC:

FOR I = 1 TO N
xxx
NEXT I

Example in Pascal:

for I := 1 to N do begin
xxx
end;

Example in Fortran:

DO I = 1,N
xxx
END DO

In many programming languages, only integers can be used at all or reliably. As a floating-point number is represented imprecisely due to hardware constraints, the following loop might iterate 9 or 10 times, depending on various factors such as rounding error, hardware, compiler. Furthermore, if the increment of X occurs by repeated addition, accumulated rounding errors may mean that the value of X in each iteration can differ quite significantly from the commonly expected sequence of 0.1, 0.2, 0.3, ..., 1.0.

for X := 0.1 step 0.1 to 1.0 do

#### Condition-controlled

Main articles: While loop and Do while loop

Some loop constructs iterate until a condition is true. Some variations test the condition at the start of the loop; others test at the end. If the test is at the start, the body may be skipped completely. At the end, the body is always executed at least once.

Example in Visual Basic:

DO WHILE (test)
xxx
LOOP

Example in Pascal:

repeat
xxx
until test;

Example in C family of pre-test:

while (test) {
xxx

Example in C family of post-test:

xxx
while (test);

Although using the `for` keyword, the 3-part, c-style loop is condition-based; not a numeric-based construct. The condition, 2nd part, is evaluated before each loop so the loop is pre-test. The 1st part is a place to initialize state and the 3rd part is for incrementing for the next iteration, but both aspects can be performed elsewhere. The following C code implements the logic of a numeric loop that iterates for i from 0 to n-1.

for (int i = 0; i < n; ++i) {
xxx

#### Enumeration

Main article: Foreach

Some loop constructs enumerate the items of a collection; iterating for each item.

Example in Smalltalk:

someCollection do: [:eachElement |xxx].

Example in Pascal:

for Item in Collection do begin xxx end;

Example in Raku:

foreach (item; myCollection) { xxx }

Example in TCL:

foreach someArray { xxx }

Example in PHP:

foreach ($someArray as $k => $v) { xxx }

Example in Java:

Collection<String> coll;
for (String s : coll) {}

Example in C#:

foreach (string s in myStringCollection) { xxx }

Example in PowerShell where 'foreach' is an alias of 'ForEach-Object':

someCollection | foreach { $_ }

Example in Fortran:

forall ( index = first:last:step... )

Scala has for-expressions, which generalise collection-controlled loops, and also support other uses, such as asynchronous programming. Haskell has do-expressions and comprehensions, which together provide similar function to for-expressions in Scala.

#### Infinite

This section is an excerpt from Infinite loop[ edit ]

In computer programming, an infinite loop (or endless loop)[9][10] is a sequence of instructions that, as written, will continue endlessly, unless an external intervention occurs, such as turning off power via a switch or pulling a plug. It may be intentional.

There is no general algorithm to determine whether a computer program contains an infinite loop or not; this is the halting problem.

#### Loop-and-a-half problem

Common loop structures sometimes result in duplicated code, either repeated statements or repeated conditions. This arises for various reasons and has various proposed solutions to eliminate or minimize code duplication.[11] Other than the traditional unstructured solution of a goto statement,[12] general structured solutions include having a conditional (if statement) inside the loop (possibly duplicating the condition but not the statements) or wrapping repeated logic in a function (so there is a duplicated function call, but the statements are not duplicated).[11]

A common case is where the start of the loop is always executed, but the end may be skipped on the last iteration.[12] This was dubbed by Dijkstra a loop which is performed "n and a half times",[13] and is now called the loop-and-a-half problem.[8] Common cases include reading data in the first part, checking for end of data, and then processing the data in the second part; or processing, checking for end, and then preparing for the next iteration.[12][8] In these cases, the first part of the loop is executed n times, but the second part is only executed n−1 times.

This problem has been recognized at least since 1967 by Knuth, with Wirth suggesting solving it via early loop exit.[14] Since the 1990s this has been the most commonly taught solution, using a break statement, as in:[8]

loop
statements
if condition break
statements
repeat

A subtlety of this solution is that the condition is the opposite of a usual while condition: rewriting while condition ... repeat with an exit in the middle requires reversing the condition: loop ... if not condition exit ... repeat. The loop with test in the middle control structure explicitly supports the loop-an-a-half use case, without reversing the condition.[14]

#### Unstructured

A loop construct provides for structured completion criteria that either results in another iteration or continuing execution after the loop statement. But, various unstructured control flow constructs are supported by many languages.

Early next iteration
Some languages provide a construct that jumps control to the beginning of the loop body for the next iteration; for example, `continue` (most common), `skip`,[15] `cycle` (Fortran), or `next` (Perl and Ruby).

Redo iteration
Some languages, like Perl[16] and Ruby,[17] have a `redo` statement that jumps to the start of the body for the same iteration.

Restart
Ruby has a `retry` statement that restarts the entire loop from the first iteration.[18]

##### Early exit

Early exit jumps control to after the loop body [19][8] For example, when searching a list, can stop looping when the item is found. Some programming languages provide a statement such as `break` (most languages), `Exit` (Visual Basic), or `last` (Perl).

In the following Ada code, the loop exits when X is 0.

loop
Get(X);
if X = 0 then
exit;
end if;
DoSomething(X);
end loop;

A more idiomatic style uses `exit when`:

loop
Get(X);
exit when X = 0;
DoSomething(X);
end loop;

Python supports conditional execution of code depending on whether a loop was exited early (with a `break` statement) or not by using an else-clause with the loop. In the following Python code, the `else` clause is linked to the `for` statement, and not the inner `if` statement. Both Python's `for` and `while` loops support such an else clause, which is executed only if early exit of the loop has not occurred.

for n in set_of_numbers:
if isprime(n):
print("Set contains a prime number")
break
else:
print("Set did not contain any prime numbers")

###### Multi-level breaks

Some languages support breaking out of nested loops; in theory circles, these are called multi-level breaks. One common use example is searching a multi-dimensional table. This can be done either via multilevel breaks (break out of N levels), as in bash[20] and PHP,[21] or via labeled breaks (break out and continue at given label), as in Ada, Go, Java, Rust and Perl.[22] Alternatives to multilevel breaks include single breaks, together with a state variable which is tested to break out another level; exceptions, which are caught at the level being broken out to; placing the nested loops in a function and using return to effect termination of the entire nested loop; or using a label and a goto statement. Neither C nor C++ currently have multilevel break or named loops, and the usual alternative is to use a goto to implement a labeled break.[23] However, the inclusion of this feature has been proposed,[24] and was added to C2Y.,[25] following the Java syntax. Python does not have a multilevel break or continue – this was proposed in PEP 3136, and rejected on the basis that the added complexity was not worth the rare legitimate use.[26]

The notion of multi-level breaks is of some interest in theoretical computer science, because it gives rise to what is today called the Kosaraju hierarchy.[27] In 1973 S. Rao Kosaraju refined the structured program theorem by proving that it is possible to avoid adding additional variables in structured programming, as long as arbitrary-depth, multi-level breaks from loops are allowed.[28] Furthermore, Kosaraju proved that a strict hierarchy of programs exists: for every integer n, there exists a program containing a multi-level break of depth n that cannot be rewritten as a program with multi-level breaks of depth less than n without introducing added variables.[27]

In his 2004 textbook, David Watt uses Tennent's notion of sequencer to explain the similarity between multi-level breaks and return statements. Watt notes that a class of sequencers known as escape sequencers, defined as "sequencer that terminates execution of a textually enclosing command or procedure", encompasses both breaks from loops (including multi-level breaks) and return statements. As commonly implemented, however, return sequencers may also carry a (return) value, whereas the break sequencer as implemented in contemporary languages usually cannot.[29]

##### Middle test

The following structure was proposed by Dahl in 1972:[30]

loop                           loop
xxx1                           read(char);
while test;                    while not atEndOfFile;
xxx2                           write(char);
repeat;                        repeat;

The construction here can be thought of as a do loop with the while check in the middle, which allows clear loop-and-a-half logic. Further, by omitting individual components, this single construction can replace several constructions in most programming languages. If xxx1 is omitted, we get a loop with the test at the top (a traditional while loop). If xxx2 is omitted, we get a loop with the test at the bottom, equivalent to a do while loop in many languages. If while is omitted, we get an infinite loop. This construction also allows keeping the same polarity of the condition even when in the middle, unlike early exit, which requires reversing the polarity (adding a not),[14] functioning as until instead of while.

This structure is not widely supported, with most languages instead using if ... break for conditional early exit.

This is supported by some languages, such as Forth, where the syntax is BEGIN ... WHILE ... REPEAT,[31] and the shell script languages Bourne shell (`sh`) and bash, where the syntax is while ... do ... done or until ... do ... done, as:[32][33]

while
statement-1
statement-2
...
condition

statement-a
statement-b
...
done

The shell syntax works because the while (or until) loop accepts a list of commands as a condition,[34] formally:

while test-commands; do consequent-commands; done

The value (exit status) of the list of test-commands is the value of the last command, and these can be separated by newlines, resulting in the idiomatic form above.

Similar constructions are possible in C and C++ with the comma operator, and other languages with similar constructs, which allow shoehorning a list of statements into the while condition:

while (statement_1, statement_2, condition) {
statement_a;
statement_b;

While legal, this is marginal, and it is primarily used, if at all, only for short modify-then-test cases, as in:[35]

while (read_string(s), strlen(s) > 0) {
// ...

#### Loop variants and invariants

Loop variants and loop invariants are used to express correctness of loops.[36]

In practical terms, a loop variant is an integer expression which has an initial non-negative value. The variant's value must decrease during each loop iteration but must never become negative during the correct execution of the loop. Loop variants are used to guarantee that loops will terminate.

A loop invariant is an assertion which must be true before the first loop iteration and remain true after each iteration. This implies that when a loop terminates correctly, both the exit condition and the loop invariant are satisfied. Loop invariants are used to monitor specific properties of a loop during successive iterations.

Some programming languages, such as Eiffel contain native support for loop variants and invariants. In other cases, support is an add-on, such as the Java Modeling Language's specification for loop statements in Java.

#### Loop sublanguage

Some Lisp dialects provide an extensive sublanguage for describing Loops. An early example can be found in Conversional Lisp of Interlisp. Common Lisp[37] provides a Loop macro which implements such a sublanguage.

#### Loop system cross-reference table

Programming language | Conditional  | Loop  | Early exit  | Loop continuation  | Redo  | Retry  | Correctness facilities

|
|
|
|
|
|
|

Begin  | Middle  | End  | Numeric  | Collection  | General  | Infinite [1] | Variant  | Invariant
Ada | Yes  | Yes  | Yes  | Yes  | arrays  | No  | Yes  | deep nested  | No  |  |  |  |
APL | Yes  | No  | Yes  | Yes  | Yes  | Yes  | Yes  | deep nested [3] | Yes  | No  | No  |  |
C | Yes  | No  | Yes  | No [2] | No  | Yes  | No  | deep nested [3] | deep nested [3] | No  | No  | No  | No
C++ | Yes  | No  | Yes  | No [2] | Yes [9] | Yes  | No  | deep nested [3] | deep nested [3] | No  | No  | No  | No
C# | Yes  | No  | Yes  | No [2] | Yes  | Yes  | No  | deep nested [3] | deep nested [3] | No  | No  | No  | No
COBOL | Yes  | No  | Yes  | Yes  | No  | Yes  | No  | deep nested [15] | deep nested [14] | No  |  |  |
Common Lisp | Yes  | Yes  | Yes  | Yes  | builtin only [16] | Yes  | Yes  | deep nested  | No  |  |  |  |
D | Yes  | No  | Yes  | Yes  | Yes  | Yes  | Yes[14] | deep nested  | deep nested  | No  |  |  |
Eiffel | Yes  | No  | No  | Yes [10] | Yes  | Yes  | No  | one level [10] | No  | No  | No [11] | integer only [13] | Yes
F# | Yes  | No  | No  | Yes  | Yes  | No  | No  | No [6] | No  | No  |  |  |
FORTRAN 77  | Yes  | No  | No  | Yes  | No  | No  | No  | one level  | Yes  | No  | No  |  |
Fortran 90  | Yes  | No  | No  | Yes  | No  | No  | Yes  | deep nested  | deep nested  | No  | No  |  |
Fortran 95 and later  | Yes  | No  | No  | Yes  | arrays  | No  | Yes  | deep nested  | deep nested  | No  | No  |  |
Go | Yes  | No  | No  | Yes  | builtin only  | Yes  | Yes  | deep nested  | deep nested  | No  |  |  |
Haskell | No  | No  | No  | No  | Yes  | No  | Yes  | No [6] | No  | No  |  |  |
Java | Yes  | No  | Yes  | No [2] | Yes  | Yes  | No  | deep nested  | deep nested  | No  |  | non-native [12] | non-native [12]
JavaScript | Yes  | No  | Yes  | No [2] | Yes  | Yes  | No  | deep nested  | deep nested  | No  | No  | No
Kotlin | Yes  | No  | Yes  | Maybe  | Yes  | No  | No  | deep nested  | deep nested  | No  | No  | No  | No
Natural  | Yes  | Yes  | Yes  | Yes  | No  | Yes  | Yes  | Yes  | Yes  | Yes  | No  |
OCaml | Yes  | No  | No  | Yes  | arrays,lists  | No  | No  | No [6] | No  | No  |  |  |
Odin  | No [17] | No  | No  | No [5] | builtin only  | Yes  | No [17] | deep nested  | deep nested  |  |  |  |
PHP | Yes  | No  | Yes  | No [2] [5] | Yes [4] | Yes  | No  | deep nested  | deep nested  | No  | No  | No  | No
Perl | Yes  | No  | Yes  | No [2] [5] | Yes  | Yes  | No  | deep nested  | deep nested  | Yes  |  |  |
Python | Yes  | No  | No  | No [5] | Yes  | No  | No  | deep nested [6] | deep nested [6] | No  | No  | No  | No
Rebol | No [7] | Yes  | Yes  | Yes  | Yes  | No [8] | Yes  | one level [6] | No  | No  |  |  |
Ruby | Yes  | No  | Yes  | Yes  | Yes  | No  | Yes  | deep nested [6] | deep nested [6] | Yes  | Yes  |  |
Rust | Yes  | No  | No  | No [5] | Yes  | No  | Yes  | deep nested  | deep nested  | No  | No  | No  | No
Standard ML | Yes  | No  | No  | No  | arrays,lists  | No  | No  | No [6] | No  | No  |  |  |
Swift | Yes  | No  | Yes  | No  | Yes  | Yes  | No  | deep nested  | deep nested  | No  | No  | No  | No
Visual Basic .NET | Yes  | No  | Yes  | Yes  | Yes  | No  | Yes  | one level per type of loop  | one level per type of loop  | No  | No  | No  | No
PowerShell | Yes  | No  | Yes  | No [2] | Yes  | Yes  | No  | Yes  | Yes  | No  | No  | No  | No
Zig | Yes  | No  | No  | No [5] | builtin only  | No  | No  | deep nested  | deep nested  | No  | No  | No  | No

1. a `while (true)` does not count as an infinite loop for this purpose, because it is not a dedicated language structure.
2. a b c d e f g h C's `for (init; test; increment)` loop is a general loop construct, not specifically a counting one, although it is often used for that.
3. a b c Deep breaks may be accomplished in APL, C, C++ and C# through the use of labels and gotos.
4. a Iteration over objects was added in PHP 5.
5. a b c d e f A counting loop can be simulated by iterating over an incrementing list or generator, for instance, Python's `range()`.
6. a b c d e Deep breaks may be accomplished through the use of exception handling.
7. a There is no special construct, since the `while` function can be used for this.
8. a There is no special construct, but users can define general loop functions.
9. a The C++11 standard introduced the range-based for. In the STL, there is a `std::for_each` template function which can iterate on STL containers and call a unary function for each element.[38] The functionality also can be constructed as macro on these containers.[39]
10. a Numeric looping is effected by iteration across an integer interval; early exit by including an additional condition for exit.
11. a Eiffel supports a reserved word `retry`, however it is used in exception handling, not loop control.
12. a Requires Java Modeling Language (JML) behavioral interface specification language.
13. a Requires loop variants to be integers; transfinite variants are not supported. Eiffel: Why loop variants are integers
14. a D supports infinite collections, and the ability to iterate over those collections. This does not require any special construct.
15. a Deep breaks can be achieved using `GO TO` and procedures.
16. a Common Lisp predates the concept of generic collection type.
17. a b Odin's general `for` loop supports syntax shortcuts for conditional loop and infinite loop.

### Non-local

Many programming languages, especially those favoring more dynamic styles of programming, offer constructs for non-local control flow which cause execution to jump from the current execution point to a predeclared point. Notable examples follow.

#### Condition handling

The earliest Fortran compilers supported statements for handling exceptional conditions including `IF ACCUMULATOR OVERFLOW`, `IF QUOTIENT OVERFLOW`, and `IF DIVIDE CHECK`. In the interest of machine independence, they were not included in FORTRAN IV and the Fortran 66 Standard. However, since Fortran 2003 it is possible to test for numerical issues via calls to functions in the `IEEE_EXCEPTIONS` module.

PL/I has some 22 standard conditions (e.g., ZERODIVIDE SUBSCRIPTRANGE ENDFILE) which can be raised and which can be intercepted by: ON condition action; Programmers can also define and use their own named conditions.

Like the unstructured if, only one statement can be specified so in many cases a GOTO is needed to decide where flow of control should resume.

Unfortunately, some implementations had a substantial overhead in both space and time (especially SUBSCRIPTRANGE), so many programmers tried to avoid using conditions.

A typical example of syntax:

ON condition GOTO label

#### Exception handling

Many modern languages support an exception handling construct that is structured; does not rely on jump semantics (goto). Generally, exceptional control flow starts with an exception object being thrown (a.k.a. raised). Control then proceeds to the inner-most exception handler for the call stack. If the handler handles the exception, then flow control reverts to normal. Otherwise, control proceeds outward to containing handlers until one handles the exception or the program reaches the outermost scope and exits. As control flows to progressively outer handlers, aspects that would normally occur such as popping the call stack are handled automatically.

The following C++ code demonstrates structured exception handling. If an exception propagates from the execution of `doSomething()` and the exception object type matches one of the types specified in a catch clause, then that clause is executed. For example, if an exception of type `SomeException` is propagated by `doSomething()`, then control jumps from line 2 to 4 and the message "Caught SomeException" is printed and then control jumps to after the `try` statement, line 8. If an exception of any other type is propagated, then control jumps from line 2 to 6. If no exception, then control jumps from 2 to 8.

try {
doSomething();
} catch (const SomeException& e)
std::println("Caught SomeException: {}", e.what());
} catch (...) {
std::println("Unknown error");

doNextThing();

Many languages use the C++ keywords (`throw`, `try` and `catch`), but some languages use other keywords. For example, Ada uses `exception` to introduce an exception handler and `when` instead of `catch`. AppleScript incorporates placeholders in the syntax to extract information about the exception as shown in the following AppleScript code.

try
set myNumber to myNumber / 0
on error e number n from f to t partial result pr
if ( e = "Can't divide by zero" ) then display dialog "You must not do that"
end try

In many languages (including Object Pascal, D, Java, C#, and Python) a `finally` clause at the end of a `try` statement is executed at the end of the try statement; whether an exception propagates from the rest of the `try` or not. The following C# code ensures that the stream `stream` is closed.

FileStream stream = null;
try

stream = new FileStream("logfile.txt", FileMode.Create);
return ProcessStuff(stream);

finally

if (stream != null)

stream.Close();

Since this pattern is common, C# provides the `using` statement to ensure cleanup. In the following code, even if ProcessStuff() propagates an exception, the `stream` object is released. Python's `with` statement and Ruby's block argument to `File.open` are used to similar effect.

using (FileStream stream = new("logfile.txt", FileMode.Create))

return ProcessStuff(stream);

#### Continuation

This section is an excerpt from Continuation[ edit ]

In computer science, a continuation is an abstract representation of the control state of a computer program. A continuation implements (reifies) the program control state, i.e. the continuation is a data structure that represents the computational process at a given point in the process's execution; the created data structure can be accessed by the programming language, instead of being hidden in the runtime environment. Continuations are useful for encoding other control mechanisms in programming languages such as exceptions, generators, coroutines, and so on.

The "current continuation" or "continuation of the computation step" is the continuation that, from the perspective of running code, would be derived from the current point in a program's execution. The term continuations can also be used to refer to first-class continuations, which are constructs that give a programming language the ability to save the execution state at any point and return to that point at a later point in the program, possibly multiple times.

#### Generator

This section is an excerpt from Generator (computer science)[ edit ]

#### Coroutine

This section is an excerpt from Coroutine[ edit ]

Coroutines are computer program components that can be suspended and resumed — generalizing subroutines — for cooperative multitasking. Coroutines are well-suited for implementing familiar program components such as cooperative tasks, exceptions, event loops, iterators, infinite lists and pipes.

They have been described as "functions whose execution you can pause".[40]

Melvin Conway coined the term coroutine in 1958 when he applied it to the construction of an assembly program.[41] The first published explanation of the coroutine appeared later, in 1963.[42]

#### COMEFROM

This section is an excerpt from COMEFROM[ edit ]

In computer programming, COMEFROM (or COME FROM) is an obscure control flow structure used in some programming languages, originally as a joke. `COMEFROM` is the inverse of `GOTO` in that it can take the execution state from any arbitrary point in code to a `COMEFROM` statement.

The point in code where the state transfer happens is usually given as a parameter to `COMEFROM`. Whether the transfer happens before or after the instruction at the specified transfer point depends on the language used. Depending on the language used, multiple `COMEFROM`s referencing the same departure point may be invalid, be non-deterministic, be executed in some sort of defined priority, or even induce parallel or otherwise concurrent execution as seen in Threaded Intercal.[citation needed]

A simple example of a "`COMEFROM x`" statement is a label `x` (which does not need to be physically located anywhere near its corresponding `COMEFROM`) that acts as a "trap door". When code execution reaches the label, control gets passed to the statement following the `COMEFROM`. This may also be conditional, passing control only if a condition is satisfied, analogous to a GOTO within an IF statement. The primary difference from GOTO is that GOTO only depends on the local structure of the code, while COMEFROM depends on the global structure – a GOTO transfers control when it reaches a line with a GOTO statement, while COMEFROM requires scanning the entire program or scope to see if any COMEFROM statements are in scope for the line, and then verifying if a condition is hit. The effect of this is primarily to make debugging (and understanding the control flow of the program) extremely difficult, since there is no indication near the line or label in question that control will mysteriously jump to another point of the program – one must study the entire program to see if any COMEFROM statements reference that line or label.

Debugger hooks can be used to implement a COMEFROM statement, as in the humorous Python goto module;[43] see below. This also can be implemented with the gcc feature "asm goto" as used by the Linux kernel configuration option CONFIG_JUMP_LABEL. A no-op has its location stored, to be replaced by a jump to an executable fragment that at its end returns to the instruction after the no-op.

#### Event-based early exit from nested loop

Zahn's construct was proposed in 1974,[44] and discussed in (Knuth 1974). A modified version is presented here.

exitwhen EventA or EventB or EventC;
xxx
exits
EventA: actionA
EventB: actionB
EventC: actionC
endexit;

exitwhen is used to specify the events which may occur within xxx, their occurrence is indicated by using the name of the event as a statement. When some event does occur, the relevant action is carried out, and then control passes just after  . This construction provides a very clear separation between determining that some situation applies, and the action to be taken for that situation.

exitwhen is conceptually similar to exception handling, and exceptions or similar constructs are used for this purpose in many languages.

The following simple example involves searching a two-dimensional table for a particular item.

exitwhen found or missing;
for I := 1 to N do
for J := 1 to M do
if table[I,J] = target then found;
missing;
exits
found:   print ("item is in table");
missing: print ("item is not in table");
endexit;

## See also

* Control flow analysis - Compiler technique
* Control-flow diagram - Business process modeling tool
* Control-flow graph - Graphical representation of a computer program or algorithm
* Control table - Data structures that control the execution order of computer commands
* Coroutine
* Cyclomatic complexity - Measure of the structural complexity of a software program
* DRAKON - Algorithm mapping tool
* Event loop - Software loop that processes events
* Flowchart
* Jeroo
* Recursion
* Scheduling (computing) - Method by which work is assigned
* Spaghetti code - Software source code with poor structure
* Switch statement - Type of selection control mechanism in computer programming languages
* Zahn's construct

## References

1. ↑ Payer, Mathias; Kuznetsov, Volodymyr. "On differences between the CFI, CPS, and CPI properties". https://nebelwelt.net/blog/20141007-CFICPSCPIdiffs.html.
2. ↑ "Adobe Flash Bug Discovery Leads To New Attack Mitigation Method". 10 November 2015. http://www.darkreading.com/vulnerabilities
threats/adobe-flash-bug-discovery-leads-to-new-attack-mitigation-method/d/d-id/1323092.
3. ↑ Endgame. "Endgame to Present at Black Hat USA 2016". www.prnewswire.com (Press release). Retrieved 2016-06-01.
4. ↑ "Nested Loops in C with Examples" (in en-US). 2019-11-25. https://www.geeksforgeeks.org/nested-loops-in-c-with-examples/.
5. ↑ "Python Nested Loops" (in en-US). https://www.w3schools.com/python/gloss_python_for_nested.asp.
6. ↑ Dean, Jenna (2019-11-22). "Nested Loops" (in en). https://medium.com/swlh/nested-loops-ee1dbb9fc8ab.
7. ↑ Knuth, Donald E. (1974). "Structured Programming with `go to` Statements". Computing Surveys 6 (4): 261–301. doi:10.1145/356635.356640.
8. ↑ 8.0 8.1 8.2 8.3 8.4 Roberts, E. [1995] "Loop Exits and Structured Programming: Reopening the Debate ," ACM SIGCSE Bulletin, (27)1: 268–272.
9. ↑ "Endless loop dictionary definition". https://www.yourdictionary.com/endless-loop.
10. ↑ "What is infinite loop (endless loop)". https://whatis.techtarget.com/definition/infinite-loop-endless-loop.
11. ↑ 11.0 11.1 "Messy Loop Conditions". WikiWikiWeb. 2014-11-03. https://wiki.c2.com/?MessyLoopConditions.
12. ↑ 12.0 12.1 12.2 Knuth 1974, p. 278, Simple Iterations.
13. ↑ Edsger W. Dijkstra, personal communication to Donald Knuth on 1974-01-03, cited in (Knuth 1974)
14. ↑ 14.0 14.1 14.2 Knuth 1974, p. 279.
15. ↑ "What is a loop and how we can use them?". http://www.megacpptutorials.com/2012/12/what-is-loop.html.
16. ↑ "redo - perldoc.perl.org". https://perldoc.perl.org/functions/redo.html.
17. ↑ "control_expressions - Documentation for Ruby 2.4.0". https://docs.ruby-lang.org/en/2.4.0/syntax/control_expressions_rdoc.html.
18. ↑ "control_expressions - Documentation for Ruby 2.3.0". https://docs.ruby-lang.org/en/2.3.0/syntax/control_expressions_rdoc.html.
19. ↑ Is a common way to solve the loop-and-a-half problem.
20. ↑ Advanced Bash Scripting Guide: 11.3. Loop Control
21. ↑ PHP Manual: "break"
22. ↑ perldoc: last
23. ↑ comp.lang.c FAQ list · "Question 20.20b"
24. ↑ "named-loops". 18 September 2024. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3355.htm.
25. ↑ "Information technology — Programming languages — C". 4 May 2025. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3550.pdf.
26. ↑ [Python-3000] Announcing PEP 3136, Guido van Rossum
27. ↑ 27.0 27.1 Kozen, Dexter (2008). "The Böhm–Jacopini Theorem is False, Propositionally". Mathematics of Program Construction. Lecture Notes in Computer Science. 5133. pp. 177–192. doi:10.1007/978-3-540-70594-9_11. ISBN 978-3-540-70593-2. https://www.cs.cornell.edu/~kozen/papers/BohmJacopini.pdf.
28. ↑ Kosaraju, S. Rao. "Analysis of structured programs," Proc. Fifth Annual ACM Syrup. Theory of Computing, (May 1973), 240-252; also in J. Computer and System Sciences, 9, 3 (December 1974), cited by (Knuth 1974).
29. ↑ David Anthony Watt; William Findlay (2004). Programming language design concepts. John Wiley & Sons. pp. 215–221. ISBN 978-0-470-85320-7.
30. ↑ Dahl & Dijkstra & Hoare, "Structured Programming" Academic Press, 1972.
31. ↑ "6. Throw It For a Loop". https://www.forth.com/starting-forth/6-forth-do-loops/.
32. ↑ The GNU Bash Reference Manual, 2025-05-18, https://www.gnu.org/software/bash/manual/bash.html
33. ↑ "How could a language make the loop-and-a-half less error-prone?". Stack Exchange: Programming Language Design and Implementation. https://langdev.stackexchange.com/questions/1815/how-could-a-language-make-the-loop-and-a-half-less-error-prone/1868#1868.
34. ↑ The GNU Bash Reference Manual, 2025-05-18, https://www.gnu.org/software/bash/manual/bash.html
35. ↑ "What does the comma operator , do?". Stack Overflow. https://stackoverflow.com/questions/52550/what-does-the-comma-operator-do/52615#52615.
36. ↑ Meyer, Bertrand (1991). Eiffel: The Language. Prentice Hall. pp. 129–131.
37. ↑ "Common Lisp LOOP macro". http://www.lispworks.com/documentation/HyperSpec/Body/m_loop.htm.
38. ↑ for_each. Sgi.com. Retrieved on 2010-11-09.
39. ↑ Chapter 1. Boost.Foreach . Boost-sandbox.sourceforge.net (2009-12-19). Retrieved on 2010-11-09.
40. ↑ "How the heck does async/await work in Python 3.5?" (in en-ca). 2016-02-11. https://snarky.ca/how-the-heck-does-async-await-work-in-python-3-5/.
41. ↑ Cite error: Invalid `<ref>` tag; no text was provided for refs named `KnuthVol1_1_4_5`
42. ↑ Cite error: Invalid `<ref>` tag; no text was provided for refs named `Conway1963`
43. ↑ Cite error: Invalid `<ref>` tag; no text was provided for refs named `:0`
44. ↑ Zahn, C. T. "A control statement for natural top-down structured programming" presented at Symposium on Programming Languages, Paris, 1974.

## Further reading

* Hoare, C. A. R. "Partition: Algorithm 63," "Quicksort: Algorithm 64," and "Find: Algorithm 65." Comm. ACM 4, 321–322, 1961.

## External links

| The Wikibook Ada Programming has a page on the topic of: Control

|

| The Wikibook Computer Programming has a page on the topic of: Control

|

* Go To Statement Considered Harmful
* A Linguistic Contribution of GOTO-less Programming
* "Structured Programming with Go To Statements". http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf. (2.88 MB)
* "IBM 704 Manual". http://www.bitsavers.org/pdf/ibm/704/24-6661-2_704_Manual_1955.pdf. (31.4 MB)

0.00

(0 votes)

Original source: https://en.wikipedia.org/wiki/Control flow. Read more

|

Retrieved from "https://handwiki.org/wiki/index.php?title=Control_flow&oldid=4151428"
*[v]: View this template
*[t]: Discuss this template
*[e]: Edit this template