【问题标题】:C preprocessor conditional statement outputC 预处理器条件语句输出
【发布时间】:2013-06-19 17:47:34
【问题描述】:

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

#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

请有人解释一下输出。

【问题讨论】:

  • 您知道 C 预处理器是什么以及它是如何工作的吗?我推荐 Kernighan,Ritchie,The C Programming Language,第 2 版作为任何潜在 C 程序员的必读。

标签: c c-preprocessor


【解决方案1】:

预处理器指令中的a 指的是预处理器定义,而不是程序中的变量。由于a 不是#defined,因此对于#if,它的值实际上是0

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案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返回负值通常意味着程序的某些错误状态终止。

      【讨论】:

        猜你喜欢
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2011-02-18
        • 2017-07-31
        • 2016-04-09
        相关资源
        最近更新 更多