C 在预处理器内部使用三元运算符

C 在预处理器内部使用三元运算符,c,C,我刚刚开始学习C,需要一些帮助来理解宏命令。我想创建一个计算两个数字之间最大值的函数 我知道名字选择得不是很好,但它只是为了测试的目的 代码如下: #include <stdio.h> #define max(a, b) (int max2, a>=b ? max2 = a : max2 = b) void main() { int a, b; scanf("%d%d", &a, &b); int maximum =

我刚刚开始学习C,需要一些帮助来理解宏命令。我想创建一个计算两个数字之间最大值的函数

我知道名字选择得不是很好,但它只是为了测试的目的

代码如下:

#include <stdio.h>
#define max(a, b) (int max2, a>=b ? max2 = a : max2 = b)

void main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    int maximum = max(a, b);
    printf("%d", maximum);
}
#包括
#定义最大值(a,b)(int-max2,a>=b?max2=a:max2=b)
void main()
{
INTA,b;
scanf(“%d%d”、&a和&b);
int最大值=最大值(a,b);
printf(“%d”,最大值);
}
我在第8行(int max=max(a,b)的那一行)上得到一个错误,它说“预期的a’”

我想这是因为我使用的预处理器是错误的(在我看来),但我不知道在这种情况下应该如何正确地使用它

谁能帮助我理解我做错了什么,以及我应该如何使用预处理器?谢谢


我认为你不了解宏是如何工作的;您不会在其中声明新变量
max2
。预处理器是一个简单的文本替换系统

宏将扩展为:

int maximum = (int max2, a>=b ? max2 = a : max2 = b);
这是一个语法错误。
max
宏非常简单,您只需要:

#define max(a, b) ((a) >= (b)) ? (a) : (b)
这将扩展到:

int maximum = ((a) >= (b)) ? (a) : (b);
这会给你想要的结果


也就是说,在您的
中已经有名为
min
max
的宏。。。我想。

我认为你不了解宏是如何工作的;您不会在其中声明新变量
max2
。预处理器是一个简单的文本替换系统

宏将扩展为:

int maximum = (int max2, a>=b ? max2 = a : max2 = b);
这是一个语法错误。
max
宏非常简单,您只需要:

#define max(a, b) ((a) >= (b)) ? (a) : (b)
这将扩展到:

int maximum = ((a) >= (b)) ? (a) : (b);
这会给你想要的结果


也就是说,在您的
中已经有名为
min
max
的宏。。。我想。

你所写的可以归结为:

int maximum = (int max2, a>=b ? max2 = a : max2 = b); // this looks weird (what's that max2 for?)
你为什么不简单地写下以下内容:

#define max(a, b) ((a)>=(b) ? (a) : (b))
这样,您的代码行就变成:

int maximum = ((a)>=(b) ? (a) : (b));

这看起来更符合逻辑。(简而言之,您不需要
max2

您所写的内容归结为:

int maximum = (int max2, a>=b ? max2 = a : max2 = b); // this looks weird (what's that max2 for?)
你为什么不简单地写下以下内容:

#define max(a, b) ((a)>=(b) ? (a) : (b))
这样,您的代码行就变成:

int maximum = ((a)>=(b) ? (a) : (b));


这看起来更符合逻辑。(简单地说,您不需要
max2

在这种情况下,在编译文件之前查看预处理器的输出非常有用。如果你还没有办法做到这一点,你绝对应该这样做。我在我的帖子中添加了一个截图。这就是你的意思吗?我的意思是在预处理后查看while文件(特别是断线)。为什么不直接使用
((a>=b)?a:b)
(int max2,…)
不是有效的表达式。在C.中的表达式中,在这样的情况下不能有变量声明,在编译文件之前查看预处理器的输出是有用的。如果你还没有办法做到这一点,你绝对应该这样做。我在我的帖子中添加了一个截图。这就是你的意思吗?我的意思是在预处理后查看while文件(特别是断线)。为什么不直接使用
((a>=b)?a:b)
(int max2,…)
不是有效的表达式。你不能在C的表达式中间有变量声明。你为什么使用这么多的错觉?难道不能只定义max(a,b)((a>b)?a:b)?@OctavianNiculescu读了这篇文章:我会的。谢谢你的时间:“难道不能只有代码< >定义max(a,b)((a> b)?a:b)< /代码>?”,不考虑<代码>马克斯(C & 1,D和1)< /代码>和<>代码> <代码>比“代码>和<代码>更高的优先级。为什么你使用这么多的偏执?难道不能只定义max(a,b)((a>b)?a:b)?@OctavianNiculescu读了这篇文章:我会的。感谢您的时间:“难道不能只有代码< >定义max(a,b)((a> b)?a:b)< /代码>?”,不考虑<代码>马克斯(C & 1,D和1)和“<代码> > />代码>比<代码>和<代码>更高的优先级。是的,你说得对,我不需要max2。但为什么你们都用了这么多的偏执?我能不能只用#define max(a,b)((a>b)?a:b)?作为括号:想象你写
#define mul(a,b)(a*b)
,你做
mul(1+2,3)
,然后你会得到
1+2*3
,也就是7,而你想要
(1+2)*3
,也就是9。您是对的,这里可能不需要括号(在
max
情况下),但这是一个好习惯。宏的参数可能是复杂的表达式,这可能会扰乱宏中的运算符优先级。在每个参数周围加上括号使它们更加独立。@Octavian Niculescu,
max(c&1,d&1)
将因
#define max(a>=b?a:b)
而失败。
(c&1>=d&1?c&1:d&1)
相当于
(c&(1>=d)&1?c&1:d&1)
@Octavian Niculescu,这又引出了另一点。我们通常对宏使用大写字母来表示它们是宏。因为做
max(昂贵的func(),有副作用的func())
是不好的。我认为它像函数一样工作,但我必须用另一种方式来定义它(用#define)。是的,你说得对,我不需要max2。但为什么你们都用了这么多的偏执?我能不能只用#define max(a,b)((a>b)?a:b)?作为括号:想象你写
#define mul(a,b)(a*b)
,你做
mul(1+2,3)
,然后你会得到
1+2*3
,也就是7,而你想要
(1+2)*3
,也就是9。您是对的,这里可能不需要括号(在
max
情况下),但这是一个好习惯。宏的参数可能是复杂的表达式,这可能会扰乱宏中的运算符优先级。在每个参数周围加上括号使其更加独立。@Octavian Niculescu,
max(c&1,d&1)
将因
#define max(a>=b?a: