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++);