1

だから私は次のプログラムを持っています:

# define swap(a,b) temp=a; a=b; b=temp; 

int main() {
int i, j, temp;
i = 5;
j = 10;
temp = 0;
if (i > j)
    swap(i, j);
printf("%d %d %d", i, j, temp);
}

これにより、次の結果が得られます。

10, 0, 0

私が理解できないのはif (5 > 10)、5 が 10 より大きくないのに、条件が「真」として実行された理由です。

4

2 に答える 2

7

これは、可能な場合はマクロを避け、制御フロー ステートメントでは常に中かっこを使用すること教えてくれるはずです。

マクロ展開後、コードは次のようになります。

if (i > j)
    temp = i;
i = j;
j = temp;

問題が見えますか?

于 2014-01-26T22:15:03.220 に答える
3

これは、コンパイル時にswap(i, j);に置き換えられるためtemp=a; a=b; b=temp;です。展開されたマクロは次のようになります

 if(i > j)
    temp = i;
    i = j;
    j = temp;  

実行時はto beのみtemp = i実行しません。 関数のように扱いたい場合は、マクロ定義を次のように変更します i > jfalse
swap(i, j)

#define swap(a,b) do {temp=a; a=b; b=temp;} while (0) 
于 2014-01-26T22:15:03.720 に答える