簡體   English   中英

在計算三個值的中間值的程序中使用宏

[英]Using Macros in a program that calculates the midrange of three values

我正在嘗試創建一個程序,該程序使用宏來確定三個值的中間范圍。 中頻定義為:

midrange(a, b, c) = (min(a, b, c) + max(a, b, c)) / 2

例如:

midrange(3, 10, 1) = (min(3, 10, 1) + max(3, 10, 1)) / 2

                   =  (1 + 10) / 2 

                   =   11 / 2

                   =  5.5 

我還是編程新手,我不確定我用於宏定義的語法是否正確。 我的第一個問題是,我可以在主 function 中定義一個宏嗎? 我的第二個問題,對於宏的主體,即替換列表,我應該使用大括號、普通括號還是什么都不用?

這是我的程序計算三個 integer 值的中間值的樣子:

#include <stdio.h>
#define MIN(A, B) {(A) < (B) ? (A) : (B);}
#define MAX(A, B) {(A) > (B) ? (A) : (B);}

int main(){
    //scans the three values
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);

    int min = MIN(MIN(a, b), c); 
    int max = MAX(MAX(a, b), c);

    //defines new macro for calculating the midrange
    //is this allowed/correct formatting and syntax?
    #define MIDRANGE((min + max) / 2);

    /* initializes variable mrange to equal to the value returned
    function-like macro, MIDRANGE */ 
    double mrange = MIDRANGE((min + max) / 2);

    printf("The mid-range is: %lf", mrange);

    return 0;

}

我將變量 mrange 聲明為 double 的原因是因為我希望 MIDRANGE 宏的值是精確的,這意味着它將在等式中除以 2 后保留小數位。

任何幫助表示贊賞:)

您可以在代碼中的任何位置聲明宏,但除非您有非常具體的理由將其使用限制為 function,否則它通常出現在.c文件的開頭或.h文件中。

宏通過替換工作。 因此,如果您有類似以下內容:

#define MIN(A, B) {(A) < (B) ? (A) : (B);}
int main(void)
{
    int min = MIN(MIN(a, b), c);
}

它將被預處理為:

int min = {({(a) < (b) ? (a) : (b);}) < (c) ? ({(a) < (b) ? (a) : (b);}) : (c);};

如果您使用的是 GCC,您可以自己查看這一點,使用命令gcc -E source.c 這顯然不是你想要的,它會給你一個編譯錯誤。

我們從不使用; 在宏的末尾,不要將它們放在塊中。 為了避免意外的運算符與復雜表達式的關聯,我們將宏參數和括號內的整個宏保護起來。

您的MIN宏應如下所示:

#define MIN(A, B) ((A) < (B) ? (A) : (B))

最后,您的MIDRANGE宏會發生兩件事。 首先,它應該采用 arguments,就像您對MIN所做的那樣。 理想情況下,應該占用三個 arguments; 畢竟,使它成為宏的全部原因是宏用戶不必計算所有內容。 其次,如果你希望結果是一個浮點數,你應該除以 2.0,而不是 2。

這是我的第一個建議:

#define MIDRANGE(A, B, C) ((MIN(MIN(A, B), C) + MAX(MAX(A, B), C)) / 2.0)

但是,為什么這是一個宏? 使其成為 function。 它更具可讀性,並且更易於維護。 所以這是我的第二個建議:

double midrange(int a, int b, int c)
{
    int min = MIN(MIN(a, b), c);
    int max = MAX(MAX(a, b), c);
    return (min + max) / 2.0;
}

關於:

#define MIN(A, B) {(A) < (B) ? (A) : (B);}
#define MAX(A, B) {(A) > (B) ? (A) : (B);}

讓我們記住,宏只不過是直接的文本替換。

所以看着:

int min = MIN(MIN(a, b), c);

結果是:

int min = { {(a) < (b)? (a): (b);} < (c);};

從上面可以明顯看出,

  1. min 在大括號 '{' 和 '}' 之外,因此很難分配給
  2. 結果語句包含兩個虛假的';' 字符,這是編譯器抱怨的

建議:

#define MIN( A, B ) ((A) < (B)) ? (A) : (B)

MAX宏也存在類似的考慮

暫無
暫無

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

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