0
#include<stdio.h>
#include<stdlib.h>

#define d 10+10

int main()
{
    printf("%d",d*d);
return 0;
}

マクロの概念は初めてですが、上記のプログラムの出力は120でしたが、その背後にあるロジックは何ですか?

ありがとう。

4

8 に答える 8

5
10+10*10+10 == 10 + 100 + 10

それは明らかですか?

于 2013-01-15T19:57:20.520 に答える
3

マクロは文字通り置き換えられます。検索/置換について考えてください。コンパイラはコードをとして認識します10+10*10+10

そのため、マクロ置換テキストを括弧で囲むのが一般的な方法です。

#define d (10 + 10)

マクロが関数のようなマクロである場合、これはさらに重要です。

#define SQ(x) ((x) * (x))

考えてSQ(a + b)...

于 2013-01-15T19:57:59.857 に答える
1

d*dに展開され10+10*10+10ます。乗算は加算の前に行われるため、10 + 100 + 10=120です。

一般に、#define式は常に括弧で囲む必要があります。#define d (10+10)

于 2013-01-15T19:58:12.027 に答える
1

マクロは単なるテキスト置換にすぎないので、次のようにします。

printf("%d",d*d);

になります

printf("%d",10+10*10+10);

constより信頼性の高い動作のために変数を使用できます。

const int d = 10+10;
于 2013-01-15T19:58:36.930 に答える
1

マクロはそのまま展開されます。あなたのプログラムは

/* declarations and definitions from headers */

int main()
{
    printf("%d",10+10*10+10);
return 0;
}

計算は次のように解釈されます

10 + (10 * 10) + 10

マクロ(およびマクロがある場合はその引数)を常に括弧で囲みます

#define d (10 + 10)
于 2013-01-15T19:58:48.047 に答える
1
#define 

プリプロセッサディレクティブは、最初の要素を2番目の要素に置き換えます。

「検索して置換」のように

于 2013-01-15T19:59:02.843 に答える
1

#includeについてはよくわかりませんが、C#では、シンボルを定義するために上部に#defineが使用されています。これにより、コーダーは次のようなことができます。

#define DEBUG

string connStr = "myProductionDatabase";

#if DEBUG
    connStr = "myTestDatabase"
#edif
于 2013-01-15T20:00:12.650 に答える
0

10+10*10+10 = 20 + 100 = 120

簡単な数学;)

マクロは値を評価しません(10 + 10を追加しません)が、発生するすべての値を指定された式に置き換えるだけです。

于 2013-01-15T19:57:27.027 に答える