首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用宏对3个数字进行排序[C]

使用宏对3个数字进行排序[C]
EN

Stack Overflow用户
提问于 2014-01-23 00:12:39
回答 3查看 1.5K关注 0票数 0

假设我们已经定义了宏交换:

代码语言:javascript
复制
#define SWAP(a,b) {\
int tmp = a; \
   a = b; \
   b = tmp;}\

使用SWAP,我们需要对3个数字进行排序(只需编写另一个使用名为SWAP的宏的宏):

代码语言:javascript
复制
#define SORT(a,b,c) \
    (a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c)))

我是这样写的,但我的代码只显示了一些错误:

代码语言:javascript
复制
#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;
}

我得到的错误:

代码语言:javascript
复制
error: expected expression before ‘{’ token|
EN

回答 3

Stack Overflow用户

发布于 2014-01-23 00:18:00

让我们展开排序(a,b,c)宏:

代码语言:javascript
复制
(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c)))

展开每个交换(a,b):

代码语言:javascript
复制
(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;
}))

这不是有效的C代码。这就是它无法编译的原因。

它的定义如下:

代码语言:javascript
复制
#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) }

顺便说一句,使用虚拟的do-while循环(参见:C multi-line macro: do/while(0) vs scope block )定义多行宏是一种很好的做法:

代码语言:javascript
复制
#define SWAP(a,b) do {\
int tmp = a; \
   a = b; \
   b = tmp;} while(0)\

这样,您就可以像编写常规函数调用一样编写它:

代码语言:javascript
复制
SWAP(a,b);
票数 3
EN

Stack Overflow用户

发布于 2014-01-23 00:18:04

在用gcc -E编译时,SORT宏是这样展开的

代码语言:javascript
复制
 (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;}))

这里的问题是交换函数中的大括号和分号。

票数 1
EN

Stack Overflow用户

发布于 2014-01-23 22:19:45

@Tamas Zahola您需要修改

代码语言:javascript
复制
#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,这将不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21288146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档