问个C/C++,程序预编译时,局部变量值的有关问题,有个小程序,希望大家解释上,多谢

问个C/C++,程序预编译时,局部变量值的问题,有个小程序,希望大家解释下,谢谢!
C/C++ code

#include <stdio.h>
int main()
{
    int i=1;
    for(i = 2; i < 5; ++i)
    {
        #if i==0          
            printf("AAA\n");
        #endif
        if(i == 3)            
            printf("BBB\n");
    }
    return 0;
}


程序很简单,结果是:
AAA
AAA
BBB
AAA

我知道#if #endif是预编译时起作用,我想知道的是预编译的时候变量i的值是0吗?为什么这样呢?这里i是个局部变量,如果把i设成全局变量的话也是效果如此的,希望明白这个问题的朋友给解释下,谢谢了!

------解决方案--------------------
预编译的表达式和程序中使用的变量 i 没有关系.
在 #if 里面, 没有通过 #define 定义过的标示符被认为是 0, 定义过的被处理成非 0. 
MSDN:
This constant expression is considered true (nonzero) if the identifier is currently defined; otherwise, the condition is false (0). An identifier defined as empty text is considered defined.
------解决方案--------------------
#if i==0是成立的,这里i被预编译器看作是一个未定义的符号,而把它处理成0值。
------解决方案--------------------
以下是预处理之后的结果。
预处理阶段的宏名i和编译阶段的变量名i没有任何关系。
C/C++ code

...
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
# 938 "/usr/include/stdio.h" 3 4

# 3 "<stdin>" 2
int main()
{
    int i=1;
    for(i = 2; i < 5; ++i)
    {

            printf("AAA\n");

        if(i == 3)
            printf("BBB\n");
    }
    return 0;
}

------解决方案--------------------
探讨
“编译期”和“运行时”不是一回事!

------解决方案--------------------
应该和这个效果是一样的:
#ifndef i 
printf("AAA\n");
#endif

预编译指令里的i和局部变量i是没有关系的。