使用宏对3个数字进行排序[C]
假设我们已经定义了宏交换:使用宏对3个数字进行排序[C],c,sorting,macros,C,Sorting,Macros,假设我们已经定义了宏交换: #define SWAP(a,b) {\ int tmp = a; \ a = b; \ b = tmp;}\ 使用SWAP我们需要对3个数字进行排序(只需编写另一个使用SWAP宏的宏): 我是这样写的,但我的代码只显示了一些错误: #include <stdio.h> #define SWAP(a,b) {\ int tmp = a; \ a = b; \ b = tmp;}\ #define SORT(a,b,c) \
#define SWAP(a,b) {\
int tmp = a; \
a = b; \
b = tmp;}\
使用SWAP我们需要对3个数字进行排序(只需编写另一个使用SWAP宏的宏):
我是这样写的,但我的代码只显示了一些错误:
#include <stdio.h>
#define SWAP(a,b) {\
int tmp = a; \
a = b; \
b = tmp;}\
#define SORT(a,b,c) \
(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c)))
int main()
{
int a = 1024, b = 7, c = 11;
printf("a = %d b = %d\n", a, b);
SWAP(a,b)
printf("a = %d b = %d\n", a, b);
printf("a = %d b = %d c = %d\n", a, b);
SORT(a,b,c)
printf("a = %d b = %d c = %d\n", a, b);
return 0;
}
让我们展开排序(a、b、c)宏:
展开每个掉期(a、b):
这不是有效的C代码。这就是它无法编译的原因
定义如下:
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }
顺便说一句,使用dummy do while循环定义多行宏是一种很好的做法(请参见:):
这样,您可以像编写常规函数调用一样编写它:
SWAP(a,b);
让我们展开排序(a、b、c)宏:
展开每个掉期(a、b):
这不是有效的C代码。这就是它无法编译的原因
定义如下:
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }
顺便说一句,使用dummy do while循环定义多行宏是一种很好的做法(请参见:):
这样,您可以像编写常规函数调用一样编写它:
SWAP(a,b);
在使用gcc-E编译时,SORT宏的扩展如下
(a > b) ? {int tmp = a; a = b; b = tmp;} : ((a > c) ? {int tmp = a; a = c; c = tmp;} : ((b>c) : {int tmp = b; b = c; c = tmp;}))
这里的问题是SWAP函数中的大括号和分号。在使用gcc-E编译时,SORT宏的扩展如下
(a > b) ? {int tmp = a; a = b; b = tmp;} : ((a > c) ? {int tmp = a; a = c; c = tmp;} : ((b>c) : {int tmp = b; b = c; c = tmp;}))
这里的问题是SWAP函数中的大括号和分号。@Tamas Zahola
您需要修改
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }
如果在整个程序中,b的值大于c,则这将不起作用。@Tamas Zahola
您需要修改
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }
如果在整个程序中,b的值大于c,则这将不起作用。错误在哪一行?错误来自特定的行。使用-E选项编译,该选项使用预处理器输出写入源代码表达式中不能有块(即括号内的语句,如
{int tmp=a;a=b;b=tmp;}
)(一组运算符和其他表达式,它们被计算成一个值,比如x?y:z
。这是C语言所不允许的。如果您将三元运算符的用法转换为If/else
语句,它应该可以正常工作,尽管我强烈建议您永远不要用这样的宏编写排序函数。错误在哪一行?错误来自特定的行。使用-E选项编译,该选项使用预处理器输出写入源代码表达式中不能有块(即括号内的语句,如{int tmp=a;a=b;b=tmp;}
)(一组运算符和其他表达式,它们被计算成一个值,比如x?y:z
。这是C语言所不允许的。如果您将三元运算符的用法转换为If/else
语句,它应该可以正常工作,尽管我强烈建议您永远不要用这样的宏编写排序函数。好的,谢谢!但是我可以不使用其他方法而只使用?
运算符吗?不,因为?:运算符需要右值。块{…}不是右值。好的,谢谢!但是我可以不使用其他方法而只使用?
运算符吗?不,因为?:运算符需要右值。块{…}不是右值。
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }