簡體   English   中英

僅使用宏查找三個數字中最大的一個

[英]Finding the largest of three numbers using macro only

我想使用這個邏輯來找到三個數字中最大的一個。 但是,我的代碼無法編譯,而且我不理解編譯器消息。 我該如何修復代碼?

#include <stdio.h>

#define LARGE(a, b, c){ \
        int max = 0, a, b, c;\
        max = ( (a+b) + abs(a+b)/2 ); \
        max = (max + c) + abs(max+c)/2);}


int main(void) {
    int a, b, c, max, Result;
    
    scanf("%d%d%d", &a, &b, &c);
    
    Result = LARGE(a, b, c);
    printf("%d", Result);
    
    return 0;
}

output 是

ain.c:12:12: error: expected expression
    Result=LARGE(a,b,c);
           ^
main.c:2:21: note: expanded from macro 'LARGE'
#define LARGE(a,b,c){ \
                    ^
1 error generated.

使用宏與使用 function 不同。宏在編譯前展開。 因此,當您定義宏時,您只需將一些代碼替換為最終可以在代碼的其他部分重用的較小代碼。 在您的情況下,這應該包含可以放在“Result=”之后的代碼。

#define LARGE(a,b,c){ \
        int max=0,a,b,c;\
        max=((a+b)+abs(a+b)/2); \
        max=(max+c)+abs(max+c)/2);} 
Result=LARGE(a,b,c)

相當於寫:

Result={ \
        int max=0,a,b,c;\
        max=((a+b)+abs(a+b)/2); \
        max=(max+c)+abs(max+c)/2);}

哪個不會編譯。 你應該把你的宏寫成:

#define LARGE(a,b,c) (((a+b)+abs(a+b)/2)+c)+abs(((a+b)+abs(a+b)/2)+c)/2) 

最終你可以有另一個宏:

#define MAX(a,b) ((a+b)+abs(a+b)/2)
#define LARGE(a,b,c) (MAX(a,b)+c)+abs(MAX(a,b)+c)/2)

那些變量a, b, c, max已經在main中聲明了,不要在宏的主體中重新聲明它們,同樣,總是喜歡:

#define macro(x) do { body } while (0)

超過

#define macro(x) { body }

看看為什么: do {... } while (0) — 它有什么用?

最后,您使用abs獲取三個數字中最大的數字的實現似乎已損壞,這是有效的(傳遞max作為參考):

#include <stdio.h>

#define LARGE(a, b, c, max)             \
do {                                    \
    if ((a) >= (b) && (a) >= (c))       \
        *(max) = (a);                   \
    else if ((b) >= (a) && (b) >= (c))  \
        *(max) = (b);                   \
    else                                \
        *(max) = (c);                   \
} while (0)

int main(void)
{
    int a, b, c, max;

    scanf("%d%d%d", &a, &b, &c);
    LARGE(a, b, c, &max);
    printf("%d\n", max);
    return 0;
}

暫無
暫無

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

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