2016-04-30 8 views
1

私は、このC++コードの抜粋を試験から持っています。私たちは、プログラムの出力が何であるかを書き出すと仮定しています。出力は「20」と仮定しましたが、出力は「10」です。どうしてこれなの?私はそうのように括弧でI + 2を入れた場合マクロ内でのC++の追加引数引数

#define func(x) (x*x)-x 

int i=3; 

int main() { 
    cout << func(i+2) << endl; 
} 

は:

cout << func((i+2)) << endl; 

それはだろうと想定として出力が '20' です。

C++はこのコードをどのように処理して、20ではなく10を返しますか?

+0

マクロはテキスト置換を行うだけで、 'func'は関数ではありません。 –

答えて

6

これはマクロの仕組みです。純粋なテキスト置換です。だから、func(i+2)のように展開さ:言うことである

(i+2*i+2)-i+2 

:通常のマクロが過度に引数を括弧で囲むことで書き込まれる理由

2*i + 4 

これは、次のとおりです。

#define func(x) (((x)*(x))-(x)) 

しかし、実際には、これはありますマクロに関数を強く推奨する理由は何ですか?引数をカッコで囲むとfunc(i+2)の使用方法が修正されますが、がマクロの場合は未定義の動作である場合はそのまま使用しますが、これはそのままではfunc(++i)に修正されません。

+0

私はこれを知らなかったので、私は教授がちょうどfuncと呼んで私たちを捕まえようとしていたと思います。 – TheDream

4

括弧は存在しないためです。

マクロは

(i+2*i+2)-i+2 

に展開され、そのすべてがそこからうまくいきません。マクロの代わりにインライン関数がうまくいくでしょう。

学習する教訓:(1)常にマクロ定義の中にカッコがあります。 (2)マクロをC++で使用しないでください!

+0

ありがとうございます。これを知らなかった。 – TheDream

関連する問題