问个C/C++,程序预编译时,局部变量值的有关问题,有个小程序,希望大家解释上,多谢
问个C/C++,程序预编译时,局部变量值的问题,有个小程序,希望大家解释下,谢谢!
程序很简单,结果是:
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
#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是没有关系的。