0

重複の可能性:
C の次のマクロの副作用は何ですか? 埋め込み C

次の出力はどうなりますか。

#include <stdio.h>
#define MAN(x,y) ((x) < (y))?(x):(y)
main()
{  
    int i=10,j=5,k=0;
    k= MAN(i++,++j);
    printf("%d %d %d" ,i,j,k);
}

ここで、MAN(10,6) が呼び出され、出力は次のようになると考えました。

11 6 6

ただし、出力は

11 7 7

誰かがこれを説明してもらえますか。

4

5 に答える 5

4

マクロがどのように機能するかを覚えておいてください。マクロはテキストをそのまま置き換え、関数が期待するように引数を評価しません。

k= MAN(i++,++j); 

実際には

k= ((i++) < (++j))?(i++):(++j)

jこれが、が 2 回インクリメントされる理由です。

于 2013-02-01T09:00:49.650 に答える
1

単純に sub: x <- i++, y <- ++j をマクロ定義に追加すると、それがわかります

((i++) < (++j))?(i++):(++j)

i++ と ++j は、比較を行うときに両方とも実行されます。比較は false を返すため、++j が実行されるため、結果が得られます。

于 2013-02-01T09:01:25.177 に答える
0

マクロでは、値を計算せず、シンボルを置き換えるだけで渡すので、このようなものになります

MAN(i++,++j) ((i++) < (++j))?(i++):(++j)

ここで ++j が 2 回実行され、答えは 11,7,7 になります。

于 2013-02-01T09:07:01.477 に答える
0

あれは。。。になる

i++ < ++j ? i++ : ++j

i は j 未満にはならないので、2 番目の引数を使用します。

i++ と ++j を実行し、別の ++j を実行します

したがって、10 + 1 =11 5 + 1 + 1 = 7 となり、2 番目の引数を返します..... 7

11 7 7

于 2013-02-01T09:01:57.190 に答える
0

MAN は関数ではなくマクロであるため、このコードは次のようになります。

k = MAN(i++,++j);

これを意味します:

k = ((i++) < (++j))?(i++):(++j)

そのため、jgets は 2 回インクリメントされます。1 回は<テストで、もう 1 回(++j)は が評価されるときです。マクロではなく関数MANである場合、式自体ではなく、インクリメントされたが渡され、期待どおりの答えが得られます。

于 2013-02-01T09:04:23.227 に答える