Effect of semicolon after 'for' loop

Say I want to print a message in C five times using a for loop. Why is it that if I add a semicolon after for loop like this:

for (i=0;i<5;i++);

the message does not get printed 5 times, but it does if I do not put the semicolon there?


Solution 1:

Semicolon is a legitimate statement called null statement * that means "do nothing". Since the for loop executes a single operation (which could be a block enclosed in {}) semicolon is treated as the body of the loop, resulting in the behavior that you observed.

The following code

 for (i=0;i<5;i++);
 {
     printf("hello\n");
 }

is interpreted as follows:

  • Repeat five times for (i=0;i<5;i++)
  • ... do nothing (semicolon)
  • Open a new scope for local variables {
  • ... Print "hello"
  • Close the scope }

As you can see, the operation that gets repeated is ;, not the printf.


* See K&R, section 1.5.2

Solution 2:

for (i=0;i<5;i++);

is equivalent to

for (i=0;i<5;i++){}

Solution 3:

The statement consisting of just the ; token is called the null statement and it does just... nothing.

For example, this is valid:

void foo(void)
{
     ;
     ;
     ;
} 

It can be used everywhere a statement can be used, for example in:

if (bla)
    ;
else
    ;

See the C Standard paragraph:

(C99, 6.8.3p3) "A null statement (consisting of just a semicolon) performs no operations."

Solution 4:

This code below will print "Hello" 5 times..

    for(i=0;i<5,printf("Hello\n");i++);