仅使用宏查找三个数字中最大的一个
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;
}
输出是
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.
那些变量a, b, c, max
已经在main
中声明了,不要在宏体中重新声明它们,另外,总是喜欢:
#define macro(x) do { body } while (0)
超过
#define macro(x) { body }
查看原因:do { ... } while (0) — what is it good for?
最后,您使用 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;
}
使用宏与使用函数不同。宏在编译前展开。因此,当您定义宏时,您只需将一些代码替换为最终可以在代码的其他部分重用的较小代码。在您的情况下,这应该包含可以放在“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)
我想用这个逻辑找到三个数中最大的一个。但是,我的代码无法编译,而且我不理解编译器消息。我该如何修复代码?
#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;
}
输出是
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.
那些变量a, b, c, max
已经在main
中声明了,不要在宏体中重新声明它们,另外,总是喜欢:
#define macro(x) do { body } while (0)
超过
#define macro(x) { body }
查看原因:do { ... } while (0) — what is it good for?
最后,您使用 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;
}
使用宏与使用函数不同。宏在编译前展开。因此,当您定义宏时,您只需将一些代码替换为最终可以在代码的其他部分重用的较小代码。在您的情况下,这应该包含可以放在“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)