2016-12-18 5 views
0

#defineを使用して関数を定義しましたが、操作の単純な結果を出力すると予期しない結果が生じます。ここでは、コードは次のとおりです。#define関数が私に予期しない結果を与える

#include <stdio.h> 

#define CUBE(x) (x * x * x) 

int main() { 
int m, n = 3; 
m = CUBE(n + 1); 
printf("%d %d", m, n--); 
return 0; 
} 

印刷結果は10と3であり、私は理由を理解することはできません。それはnをそれ自身で3倍に増やしてから1を加算するので、結果は28と3ではないでしょうか?

+1

'#define'の正しい計算を取得することは、プレーンテキスト置換です。この置換をyoruコードで行い、コードがどのように見えるかを確認してください –

+0

プリプロセッサについて知っておくべきことがすべて分かったら、これを知ることができます:関数を定義する場合は、マクロではなく関数を定義します。 –

答えて

1

あなたは#defineの機能を持っていません。あなたは#defineのマクロであり、機能とはまったく異なります。

  1. これらは呼び出されません。コードはコンパイラによってコンパイルされる前に、プリプロセッサによって直接ソースコードに展開されます。

  2. これらは、注意する必要があるpitfallsです。名前を付けるために、マクロに副作用のある式を渡すと、そのパラメータが2回以上使用されると、副作用になります。間違った結果が得られます。

    (n + 1 * n + 1 * n + 1) 
    
0
#define CUBE(x) ((x) * (x) * (x)) 

はあなたに期待される結果を与える必要があります:

  • 変電所はそう

    CUBE(n + 1) 
    

    たが、これに拡大されます、プレーンなトークン置換です。あなたに

    は、前処理に、CUBE(x)xは、マクロは、プレーン・テキスト置換であるとして、あなたに

    (3+1 * 3+1 * 3+1) // this happens during pre-processing, not in run time 
    

    を与える3+1でを置き換えられます。あなた10与える

    (3+(1 * 3)+(1 * 3)+1) 
    

    のようにグループ化されます

    。もっと複雑な場合は、関数を書くことをお勧めします。

  • 0

    前の回答が既に示唆しているように、プリプロセッサは基本的に検索と置換を行うため、角括弧( )がありません。あなたのバージョンの結果は

    ​​

    となります。結果は次のとおりです。

    #define CUBE(x) ((x) * (x) * (x)) 
    

    を使用すると、

    m = (n + 1) * (n + 1) * (n + 1) 
    
    関連する問題