簡體   English   中英

使用宏對3個數字進行排序[C]

[英]Sort 3 numbers using macros [C]

可以說我們定義了宏SWAP:

#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|

讓我們擴展您的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多行宏:do / while(0)vs作用域塊 ):

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

這樣,您可以像常規函數調用一樣編寫它:

SWAP(a,b);

在使用gcc -E進行編譯時,SORT宏就是這樣擴展的

 (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功能中的花括號和半冒號。

@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,則此方法將無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM