3

私の先生は、C++ の次の中間テストのいくつかのプログラム例の 1 つとしてこれを示しました。コードは次のとおりです。

//What does this program print?

#include <iostream>
using namespace std;

#define foo1( a )  a * a

int j = 6;

inline  int
foo2( int a ) 
{
    return a * a;
}

void
goo1( int& x )
{
    x = 3;
}

void
goo2( int  x )
{
    x = 3;
}

int main()
{
    int i, j = 12;

    cout << "foo1 = " << foo1( 3 + 2 ) << "\n";
    cout << "foo2 = " << foo2( 3 + 2 ) << "\n";

    i = 5;
    goo1( i );
    cout << "goo1 = " << i << "\n";
    i = 5;
    goo2( i );
    cout << "goo2 = " << i << "\n";

    cout << "  j = " <<   j << "\n";
    cout << "::j = " << ::j << "\n";
}

誰かが foo1 = 11 をどのように説明してくれますか?

4

5 に答える 5

8

foo1 はマクロです。マクロは厳密な検索と置換を実行するため、foo1(3+2) は 3+2*3+2 に置き換えられます。操作の順序に従って、3+2*3+2 = 3+6+2 = 11.

于 2013-05-09T07:41:11.300 に答える
2

マクロは次のように打ち出されるためです。

cout << "foo1 = " << 3 + 2 * 3 + 2 << "\n";

そして、単純なBODMASは、それが11に等しいことを教えてくれます:)つまり 3 + (2 * 3) + 2

于 2013-05-09T07:41:53.893 に答える
2

あなたが持っている

#define foo1( a )  a * a

だからあなたが言うときfoo1( 3 + 2 )、コンパイラは見3 + 2 * 3 + 2ます。明らかに11

マクロfoo1で乗算を実行する場合は、次のようにする必要があります。

#define foo1(a) ((a)*(a))
于 2013-05-09T07:41:40.710 に答える
0

foo1 は として定義されたマクロ foo1(a) a * aです。

すべての#defineステートメントは C プリプロセッサ マクロ ステートメントです。それらは、コンパイルが行われる前に文字通りコードに展開されます。

そう

#define foo1(a) a * a

変化

cout << "foo1 = " << foo1( 3 + 2 ) << "\n";

cout << "foo1 = " << 3 + 2 * 3 + 2 << "\n";

展開に a の周りに括弧がないため、評価は 11 です。

期待どおりに動作することを確認したい場合 (つまり、最終的に 25 になる)、次のように定義を試すことができます。

#define foo1(a) (a) * (a) 

最終的に25になることがわかります

また、正しいコンパイラ オプションを使用すると、プリプロセッサの出力を確認できるはずです。gcc または g++ の場合は -E ...

楽しんでいただければ幸いです

于 2013-05-09T07:48:12.820 に答える