C预处理器条件语句输出

时间:2013-06-19 17:47:34

标签: c c-preprocessor

我有这段代码,但无法理解输出。有人可以帮助了解行为

#include<stdio.h>
int main(){

int a =1;
#if(a==0)
  printf("equal");
#else if
  printf("unequal");
#endif

return -1;
}

输出结果为 equal 。对我来说很奇怪。

此外,如果我将if条件更改为a==2,则输出 unequal

如果我尝试在'if'块内打印'a'的值,就像

一样
#if(a==0)
 printf("value of a: %d",a);

输出结果为 value of a: 1

请有人解释输出。

3 个答案:

答案 0 :(得分:6)

预处理程序指令中的a引用预处理程序定义,而不是程序中的变量。由于a不是#define d,因此对于0,其值实际上为#if

答案 1 :(得分:3)

预处理程序指令(以#开头的行)在编译时处理,而不是在运行时处理。 a中的#if与您声明的a变量不同。预处理器只是用0替换它,因为任何地方都没有#define a语句。变量a在您的程序中未使用。如果您执行使用它,就像在您显示的printf语句中一样,它将按预期打印 - 您指定给它的值为1

答案 2 :(得分:3)

#include<stdio.h>
int main(){

int a =1;
#if(a==0)
  printf("equal");
#else if
  printf("unequal");
#endif

return -1;
}
传递给编译器的

将首先通过preprocessor,然后将其输出作为输入发送给编译器;预处理器将发送

#include<stdio.h>
int main(){

int a =1;
printf("equal");

return -1;
}

到编译器,这就是你总是看到equal的原因。原因是因为a作为宏未定义,第一个条件为真,导致只将该语句传递给编译器。如果您尝试在include指令旁添加#define a 1,那么您将始终将unequal视为输出;但是这些更改只影响编译时宏a而不影响运行时变量a(两者完全不同)。

这一切都是因为预处理器只关注编译时结构。你真正需要的可能是

#include<stdio.h>
int main(){

   int a =1;
   if(a == 0)
     printf("equal");
   else
     printf("unequal");

   return 0;
}

旁白:当程序成功时返回0,从main返回负值通常意味着程序的某些错误状态终止。