gpt4 book ai didi

c - 在计算三个值的中间值的程序中使用宏

转载 作者:行者123 更新时间:2023-11-30 20:17:15 24 4
gpt4 key购买 nike

我正在尝试创建一个程序,该程序使用宏来确定三个值的中间范围。中频定义为:

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

我对编程还是新手,我不确定我用于宏定义的语法是否正确。我的第一个问题是,我可以在 main 函数中定义宏吗?我的第二个问题,对于宏的主体(即替换列表),我应该使用大括号、普通括号还是什么都不用?

这就是我的程序用于计算三个整数值的中间值的样子:

#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后保留小数位。

感谢任何帮助:)

最佳答案

您可以在代码中的任何位置声明宏,但除非您有非常具体的原因将其使用限制为函数,否则它通常出现在 .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 自行查看。这显然不是你想要的,它会给你一个编译错误。

我们从不在宏末尾使用;,也不将它们放在 block 中。为了避免意外的运算符与复杂表达式关联,我们将宏参数和整个宏保护在括号内。

您的 MIN 宏应如下所示:

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

最后,您的 MIDRANGE 宏发生了两件事。首先,它应该接受参数,就像您对 MIN 所做的那样。理想情况下,它应该采用三个参数;毕竟,将其设为宏的全部原因是宏用户不必计算所有内容。其次,如果您希望结果是 float ,则应该除以 2.0,而不是 2。

这是我的第一个建议:

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

但是,为什么这是一个宏呢?让它成为一个函数。它更具可读性,并且更易于维护。这是我的第二个建议:

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;
}

关于c - 在计算三个值的中间值的程序中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com