[英]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);};
從上面可以明顯看出,
建議:
#define MIN( A, B ) ((A) < (B)) ? (A) : (B)
MAX
宏也存在類似的考慮
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.