0

私はこれにCコードが与えられており、見出しステートメントには次のものが含まれています。

#define, EQ(a, b) ((a) == (b))

どういう意味ですか?

4

3 に答える 3

6

それは何の意味もありません。このコードは形式が正しくありません。の直後のトークン#defineは識別子である必要がありますが、そうで,はありません。

,が削除された場合、これは2つの引数を取るという名前の関数のようなマクロを定義します。EQ

于 2012-08-08T03:43:33.953 に答える
6

カンマは、コードのコンパイルを妨げるエラーです。タイプミスだと思います。

与えられた:

#define EQ(a, b) ((a) == (b))

これは、等式演算子のマクロを定義します==

コードの後半でこのマクロを使用すると、次のように入力できます。

if (EQ(2+2, 4))

それ以外の:

if (2+2 == 4)

あまり役に立たない、本当に。

于 2012-08-08T03:44:21.680 に答える
2

一歩一歩進んでいきましょう

#define MAX 10

これにより、コード ファイル内の単語 "MAX" のすべてのインスタンスが 10 に置き換えられます。これは定数変数を定義するのとよく似ていますが、大きな違いが 1 つあります。#define ステートメントの解釈は、コンパイルの前に行われます。これは、MAX を配列サイズとして使用する例に役立ちます。代わりに変数を使用した場合、多くの場合、コンパイラ エラーが発生します。

Linux ターミナルでコマンドを使用cpp <filename.c>して、マクロが実行されたときに何が起こるかを確認できます。

例として、このコード:

#define MAX 10
int numbers[MAX];

前処理後 (つまり、プリプロセッサ マクロの解釈)

int numbers[10];

#define ステートメントは、解釈されると消えてしまうことに注意してください。

これにより、別の例が表示されます

#define square(x) (x * x)

square(x)コード内の のすべてのインスタンスがに置き換えられるだけでなく(x * x)、x の値も置き換えられます。これは関数の減速に似た効果がありますが、やはり異なります

それで

square(5)に置き換えられます(5 * 5)

最後に私たちの例

#define, EQ(a, b) ((a) == (b))

これにより、のすべてのインスタンスが置き換えEQ(a, b)られます((a) == (b))

例として

EQ(4, 5)に置き換えられます((4) == (5))

「==」とはどういう意味ですか? 4 と 5 が等しい場合は「等しいかどうかのチェック」です。式全体が 1 として評価されます (これは明らかに真ではありません)。したがって、この式は最終的に 0 として評価されます。

多かれ少なかれこの機能の効果が好きです

int EQ(int a, int b)
{
    return (a == b);
}

次のように書くこともできます

int EQ(int a, int b)
{
    if (a ==b) return 1;
    if (a !=b) return 0;
}

マクロを使用すると、2 つの変数宣言が回避され、実際には関数呼び出しがなく、一般に高速であることに注意してください。低速のプロセッサー (またはマイクロプロセッサー) を使用している場合、この利点は明らかです。

最後に、明らかなことを述べさせてください

#define simple_macro 5
int some_integer_variable = 10;
.
.
.
some_integer_variable = simple_macro;
simple_macro = 12;  /* illegal statement */
simple_macro++;     /* illegal statement */

プリプロセッサを実行した後、これは

int some_integer_variable = 10;
.
.
.
some_integer_variable = 5;
5 = 12;
5 ++;

おー!話しすぎたかもしれませんが、この(明らかな)コードを残しましょう

#define MAX 10
int variable = MAX; /*this is a MAX variable */
char some_string[] = "the MAX value";  /* no replacement will happen here */
int variable_MAX;                      /* no replacement will happen here */

プリプロセッサを実行すると、

int variable = 10;
char some_string[] = "the MAX value";
int variable_MAX;
于 2012-08-08T06:55:46.937 に答える