#include<stdio.h>
#include<stdlib.h>
#define d 10+10
int main()
{
printf("%d",d*d);
return 0;
}
マクロの概念は初めてですが、上記のプログラムの出力は120でしたが、その背後にあるロジックは何ですか?
ありがとう。
#include<stdio.h>
#include<stdlib.h>
#define d 10+10
int main()
{
printf("%d",d*d);
return 0;
}
マクロの概念は初めてですが、上記のプログラムの出力は120でしたが、その背後にあるロジックは何ですか?
ありがとう。
10+10*10+10 == 10 + 100 + 10
それは明らかですか?
マクロは文字通り置き換えられます。検索/置換について考えてください。コンパイラはコードをとして認識します10+10*10+10
。
そのため、マクロ置換テキストを括弧で囲むのが一般的な方法です。
#define d (10 + 10)
マクロが関数のようなマクロである場合、これはさらに重要です。
#define SQ(x) ((x) * (x))
考えてSQ(a + b)
...
d*d
に展開され10+10*10+10
ます。乗算は加算の前に行われるため、10 + 100 + 10=120です。
一般に、#define
式は常に括弧で囲む必要があります。#define d (10+10)
マクロは単なるテキスト置換にすぎないので、次のようにします。
printf("%d",d*d);
になります
printf("%d",10+10*10+10);
const
より信頼性の高い動作のために変数を使用できます。
const int d = 10+10;
マクロはそのまま展開されます。あなたのプログラムは
/* declarations and definitions from headers */
int main()
{
printf("%d",10+10*10+10);
return 0;
}
計算は次のように解釈されます
10 + (10 * 10) + 10
マクロ(およびマクロがある場合はその引数)を常に括弧で囲みます
#define d (10 + 10)
#define
プリプロセッサディレクティブは、最初の要素を2番目の要素に置き換えます。
「検索して置換」のように
#includeについてはよくわかりませんが、C#では、シンボルを定義するために上部に#defineが使用されています。これにより、コーダーは次のようなことができます。
#define DEBUG
string connStr = "myProductionDatabase";
#if DEBUG
connStr = "myTestDatabase"
#edif
10+10*10+10 = 20 + 100 = 120
簡単な数学;)
マクロは値を評価しません(10 + 10を追加しません)が、発生するすべての値を指定された式に置き換えるだけです。