Up until this point, you have seen three versions of flow-control:
There is one additional flow-control statement in C++: the goto statement. Any statement in a C++ function can be given an identifier as a label. While it looks odd:
double factorial( unsigned int n );
double factorial( unsigned int n ) {
first: if ( n <= 1 ) {
second: return 1.0;
} else {
third: double result = 1.0;
fourth: for ( unsgined int i = 1; i <= n; ++i ) {
fifth: result *= i;
}
sixth: return result;
}
}
Each label is an identifier. It is now possible to jump within a function to the label first: by using the statement goto first;. This causes the execution to continue executing that statement.
For example, the structured implementation of insertion sort, as we have seen it, uses a for-loop and a while-loop. This same program can be written with three goto statements:
template <typename T>
void insertion_sort_structured( T array[], size_t n );
template <typename T>
void insertion_sort_goto( T array[], size_t n );
template <typename T>
void insertion_sort_structured( T array[], size_t n ) {
for ( size_t i = 1; i < n; ++i ) {
T current = array[i];
size_t j = i;
while ( (j > 0) && (array[j - 1] > current) ) {
array[j] = array[j - 1];
--j;
}
array[j] = current;
}
}
template <typename T>
void insertion_sort_goto( T array[], size_t n ) {
size_t i{1};
first: T current{array[i]};
size_t j{i++};
second: if ( array[j - 1] <= current ) {
goto third;
}
array[j] = array[j - 1];
if ( --j ) {
goto second;
}
third: array[j] = current;
if ( i != n ) {
goto first;
}
}
Using the goto statement can often be used to make code faster, but inevitably it resulted in code that was difficult to read: for example, the flow of the goto-implementation of the insertion sort causes one to think of spaghetti:

![]()
The use of the goto statement is highly discouraged, or outright banned as is the case of the JPL coding standard:
Rule 11 (simple control flow)
The goto statement shall not be used.
Two papers you should consider reading include