简体   繁体   中英

Weird behaviour of C for loop with i++ as condition

I have the following code:

int main()
{
    char i = 0;

    for (; i++; printf("%d", i));

    printf("%d", i);

    return 0;
}

It successfully compiles and prints 1 . I am new to C and I don't understand this. I thought i++ will always be true and so it will be an infinite loop.

Can someone please explain this to me?

i++ is post-increment . So at the time of checking the statement, the value of i is 0 , which is false . Hence, the loop breaks.

  for (; i++; printf("%d", i)); 

is legal C code, but is not idiomatic C code. Real C programmers never code like this (but can understand what happens). Read n1570 (it practically is the C standard) §6.8.5.3 for the meaning of for :

6.8.5.3 The for statement

1 The statement

  for ( clause-1 ; expression-2 ; expression-3 ) statement 

behaves as follows: The expression expression-2 is the controlling expression that is evaluated before each execution of the loop body. The expression expression-3 is evaluated as a void expression after each execution of the loop body. If clause-1 is a declaration, the scope of any identifiers it declares is the remainder of the declaration and the entire loop, including the other two expressions; it is reached in the order of execution before the first evaluation of the controlling expression. If clause-1 is an expression, it is evaluated as a void expression before the first evaluation of the controlling expression.158)

2 Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a nonzero constant.

Footnotes

158) Thus, clause-1 specifies initialization for the loop, possibly declaring one or more variables for use in the loop; the controlling expression, expression-2, specifies an evaluation made before each iteration, such that execution of the loop continues until the expression compares equal to 0; and expression-3 specifies an operation (such as incrementing) that is performed after each iteration.

So, in your case, the controlling expression (the " expression-2 " in the C standard) is (wrongly) i++ . It happens to be false on the first time the loop is taken.

If you replace i++ by ++i the condition stays true for 255 times on my Linux computer (since I have unsigned chars on 8 bits).

If your computer has signed chars, you technically have some undefined behavior , because you have a signed overflow. So be very scared and read Lattner's blog on UB!

I am new to C and I don't understand this.

Then you should read some C reference site, sometimes refer to the C11 standard n1570 , read good books on C programming (perhaps even read good introduction to programming, such as SICP - which does not use C), and learn how to debug small programs . If you use some GCC compiler, be sure to enable all warnings and debug info, so compile with gcc -Wall -Wextra -g .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM