2014-01-22 78 views
0

假設我們已經定義的宏SWAP 3個數字:排序使用宏[C]

#define SWAP(a,b) {\ 
int tmp = a; \ 
    a = b; \ 
    b = tmp;}\ 

,並使用SWAP我們需要3個數字排序(只寫它採用宏觀稱爲SWAP另一個宏):

#define SORT(a,b,c) \ 
    (a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c))) 

我這樣寫這個,但我的代碼只顯示一些錯誤:

#include <stdio.h> 

#define SWAP(a,b) {\ 
int tmp = a; \ 
    a = b; \ 
    b = tmp;}\ 

#define SORT(a,b,c) \ 
    (a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c))) 

int main() 
{ 
    int a = 1024, b = 7, c = 11; 

    printf("a = %d b = %d\n", a, b); 
    SWAP(a,b) 
    printf("a = %d b = %d\n", a, b); 

    printf("a = %d b = %d c = %d\n", a, b); 
    SORT(a,b,c) 
    printf("a = %d b = %d c = %d\n", a, b); 

    return 0; 
} 

錯誤,我得到:

error: expected expression before ‘{’ token| 
+0

錯誤是什麼?錯誤來自特定的行。 – abelenky

+0

使用-E選項進行編譯,該選項使用預處理器輸出寫入源 – suspectus

+1

您不能在*中使用* blocks *(即括號括起的語句,例如'{int tmp = a; a = b; b = tmp;}') *表達式*(運算符和其他表達式的集合,它們被賦值爲一個值,比如'x?y:z',這只是C語言所不允許的,如果將三元運算符的使用轉換爲if/else '聲明,它應該可以正常工作,儘管我建議你不要用這樣的宏編寫排序函數。 –

回答

3

讓我們擴展您的SORT(A,B,C)宏:

(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c))) 

展開每個SWAP(A,B):

(a > b) ? { 
int tmp = a; 
a = b; 
b = tmp; 
} : ((a > c) ? { 
int tmp = a; 
a = c; 
c = tmp; 
} : ((b>c) : { 
int tmp = b; 
b = c; 
c = tmp; 
})) 

這不是有效的C代碼。這就是爲什麼它不能編譯。

將其定義是這樣的:

#define SORT(a,b,c) \ 
    if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) } 

順便說一句,這是一個很好的做法,使用定義多宏虛擬DO-while循環(參見:C multi-line macro: do/while(0) vs scope block):

#define SWAP(a,b) do {\ 
int tmp = a; \ 
    a = b; \ 
    b = tmp;} while(0)\ 

這樣,你可以像普通函數調用一樣寫出來:

SWAP(a,b); 
+0

好的,謝謝!但是,如果僅僅使用'?'運算符,我可以做到嗎? – yak

+1

不,因爲?:運算符期望右值。塊{...}不是右值。 –

1

使用gcc -E編譯SORT macr o像這樣擴大了

(a > b) ? {int tmp = a; a = b; b = tmp;} : ((a > c) ? {int tmp = a; a = c; c = tmp;} : ((b>c) : {int tmp = b; b = c; c = tmp;})) 

這裏的問題是SWAP函數中的大括號和分號。

0

@Tamas Zahola 您需要修改

#define SORT(a,b,c) \ 
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) } 

這一點,如果B的價值會更大然後是C在整個程序將無法正常工作。