Logo  

CS351 - Computer Organization

Reading:

Loops:

Loops are the repeated execution of some segment of code for as long as a specific Boolean condition (often called the test-expression,) remains true. Remember that in C any non-zero value is considered true, 0 is considered false.

The "while" loop:

The simplest form of loop is the "while" loop, which executes it's statement for as long as its expression remains true:

while (expression) statement

This might look familiar to the if-statement, which executes it's statement if the expression is true. A while loop is ultimately like an if-statement that just keeps executing the statement over and over for as long as the expression remains true.

examples:

// This loop will never stop, since the expression is always true.
while (1) printf("Print forever\n");

/**
 * Prints 0 through 9. Remember that 'i++' gives it's value before incrementing.
 * When i becomes 10, the expression is no longer true, so the execution moves
 * on to the statements that follow the while loop.
 */
int i=0;
while (i < 10) printf("%d\n", i++);

// The same as the previous but using a compound statement and moving the
// increment of i outside of the printf() function.
int i = 0;
while (i < 10) {
  printf("%d\n", i);
  i = i + 1;
}

The "for" loop:

Many loops have the form:

initilize some index variable(s)
while ( test-expression ) {
  statements
  increment index variable(s)
}

so a specific type of loop was created to handle this form specifically, it is the "for" loop:

for( init-expression ; test-expression ; increment-expression) statement

Note:

  • All three expressions are optional and may be omitted, however the ;'s must remain present. i.e.:

// Will loop forever:
for(;;) statement

  • init-expression is only performed once. You may declare variables inside this expression, however these variables are not visible outside of the for loop.

  • test-expression is performed at the beginning of each loop, performing the statement only if this is true. If omitted it is always true.

  • increment-expression is performed after the statement (or compound statement) at the end of each loop. This is always executed even if a continue is raised.

examples:

// print 0 to 9.  Note we're using a compound statement:
for(int i=0; i < 10; i++) {
  printf("%d\n",i);
}

// Print from 10 down to 0.
for(i=10; i >= 0; i--) printf("%d\n", i);

// Print from 'start' to 'end', skipping 'skip' steps after each output:
// start, end and skip are integer variables that contain some value.
for(i=start; i < end; i = i + skip)
  printf("%d\n", i);

Loop Control Statements:

Sometimes we want to exit a loop or do the next loop iteration early, to do so we use the break; and continue; statements respectively.

Break

The break statement exits a loop (or a switch statement, discussed at a later time,) immediately. Execution continues at the point following the loop.

Grammar:

break;

Example:

/**
 * Prints 0 through 6. Stops printing when i becomes 7 because the if statement
 * becomes true and thus executes the break, which causes the for loop to
 * terminate.
 */
for(int i=0; i < 10; i++) {
  if (i > 6) break;
  printf("%d\n", i);
}

Continue

In a while loop it immediately moves execution to the test-expression of the while loop.

In a for loop it immediately moves execution to the increment-expression part of the loop, which then moves to the test-expression.

Grammar:

continue;

Example

int sum = 0, n;

/**
 * The following will read integers from the input and accumulate a sum of all
 * positive non-negative values.  The `sum = sum + n` statement will be skipped
 * when n is <= 0 because the continue will move execution back to the
 * test-expression of the while loop immediately.
 */
while (scanf("%d", &n) == 1) {
  if (n <= 0) continue;
  sum = sum + n;
}

printf("sum = %d\n", sum);

int sum = 0, n;

// Another way of writing the above example:
while (1) {
  if (scanf("%d", &n) != 1) break;
  // Note how the test condition is reversed (!= vs ==) since we only want to exit the loop
  // when the scanf fails to read one integer.
  if (n <= 0) continue;
  sum = sum + n;
}

printf("sum = %d\n", sum);

// This will only print the numbers 3 through 6:
for(i=0; i < 10; i++) {
  if (i < 3) continue;  // If i < 3 go immediately to the increment-expression
  if (i > 6) break;     // When i reaches 7 (i.e. > 6) exit the loop.
  // Only when i passes the above two checks does this statement run:
  printf("%d\n", i);
}

// i will be == 7 here, since the for loop exited early.