Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用宏对3个数字进行排序[C]_C_Sorting_Macros - Fatal编程技术网

使用宏对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) }