0

このコードはありますが、出力を理解できません。誰かが行動を知るのを手伝ってくれますか

#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

誰かが出力を説明してください。

4

3 に答える 3

6

aプリプロセッサ ディレクティブのは、プログラム内の変数ではなく、プリプロセッサ定義を参照します。aは d ではないため#define、その値は0の目的に効果的です#if

于 2013-06-19T17:49:14.710 に答える
3

プリプロセッサ ディレクティブ ( で始まる行#) は、実行時ではなくコンパイル時に処理されます。そのainは、宣言した変数#ifと同じではありません。どこにもステートメントがないため、aプリプロセッサはそれを に置き換えるだけです。変数がプログラムで使用されていません。あなた示すステートメントのように、それを使用すると、期待どおりに出力されます-割り当てた値。0#define aaprintf1

于 2013-06-19T17:49:25.527 に答える
3
#include<stdio.h>
int main(){

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

return -1;
}

コンパイラに渡すと、最初にプリプロセッサを通過し、その出力がコンパイラへの入力として送信されます。プリプロセッサが送信します

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

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

return -1;
}

equalこれが、常に表示される理由です。その理由はa、マクロが未定義であるため、最初の条件が真であり、そのステートメントのみがコンパイラに渡されるためです。#define a 1include ディレクティブの横に追加しようとすると、常に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-19T17:54:07.137 に答える