For Loop Variations

Last week, we examined the structure of the for loop. Today we will look at some for loop idioms.

Infinite loop

If you omit the initialization, condition and action expressions, you get an infinite loop:

for (;;) {
  NSLog(@":-)");
}

Missing loop expression

Sometimes, there's no need to initialize a variable before looping, so the initialization expression is omitted:

char *process_line(char *buffer) {
  for ( ; *buffer != '\n'; buffer++) {
    /* do something with characters */
  }
  return buffer;
}

Similarly the condition or action expressions are sometimes omitted.

Nested loops

When building or processing tables of information, put one for loop inside another:

for (int i = 1; i <= 10; i++) {
  for (int j = 1; j <= 10; j++) {
    NSLog(@"%d X %d = %d", i, j, i * j);
  }
}

Parallel iteration

You can use multiple loop counter variables by using the comma (,) operator to squeeze multiple expressions into initialization and action:

int i, j;
for (i = 0, j = 9; i < 10; i++, j--) {
  destination[i] = source[j];
}

There's a gotcha with the initialization expression however: only one loop counter variable can be declared there. It seems logical to do this:

for (int i = 0, int j = 9; i < 10; i++, j--) ...

but unfortunately you can only do this:

int j;
for (int i = 0, j = 9; i < 10; i++, j--) ...

Next week, we'll look at the Objective-C 2.0 for...in loop.