免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3085 | 回复: 13
打印 上一主题 下一主题

[C] 一个C的宏看不懂,请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 22:14 |只看该作者 |倒序浏览
代码如下,#define Exchage(a,b) (a^=b^=a^=b) 替换怎样进行的

#define Exchage(a,b) (a^=b^=a^=b)
void func4(){
  int a=30,b=60;
  Exchage(a,b);
  printf("a is %d,b is %d",a,b);
  return ;
}

论坛徽章:
0
2 [报告]
发表于 2009-04-17 23:38 |只看该作者
不利用临时变量交换两个整型值 是很多面试 笔试题目中最经常的一个吧?

两种方法:
1,a ^= b;   b ^= a;   a ^= b;

2,a=a+b;   b=a-b;    a=a-b;

LZ给的就是第一种方法的合并,连续等号赋值就是从右往左
另外,第二种方法会产生溢出,所以一般就使用第一种

论坛徽章:
0
3 [报告]
发表于 2009-04-18 00:18 |只看该作者
a^=b^=a^=b
在编译的时候是左扫描还是有扫描的?
感觉靠这样的赋值表达很无聊。。。

论坛徽章:
0
4 [报告]
发表于 2009-04-18 00:28 |只看该作者
靠这种技俩实现交换,绝对是很差的设计。

无论怎样,清楚的逻辑思维是很重要的。


#define swap(a,b)        \
  ( { typeof(*a) t = *a;   \
      *a = *b;             \
      *b = t;             \
  } )

论坛徽章:
0
5 [报告]
发表于 2009-04-18 01:02 |只看该作者

回复 #4 mik 的帖子

赞成LS的说法@!呵呵

我觉得就是理论和实际的写法差别!
很多东西似乎都是笔试、面试的问题,有很多东西似乎实际没有人会这么写!:wink: :wink:

论坛徽章:
0
6 [报告]
发表于 2009-04-18 09:18 |只看该作者

回复 #1 shasha528 的帖子

这样写可读性不好
用^=的方式,当a等于b时有异常

论坛徽章:
0
7 [报告]
发表于 2009-04-18 09:42 |只看该作者
C FAQ 说这种方式不具可移植性,它试图在序列点之间两次修改变量 a,而这是 undefined。

论坛徽章:
0
8 [报告]
发表于 2009-04-18 10:03 |只看该作者
原帖由 lenky0401 于 2009-4-17 23:38 发表
不利用临时变量交换两个整型值 是很多面试 笔试题目中最经常的一个吧?

两种方法:
1,a ^= b;   b ^= a;   a ^= b;

2,a=a+b;   b=a-b;    a=a-b;

LZ给的就是第一种方法的合并,连续等号赋值就是从右 ...


谢谢你给的解答  ,我明白了

论坛徽章:
0
9 [报告]
发表于 2009-04-18 10:06 |只看该作者
原帖由 mik 于 2009-4-18 00:28 发表
靠这种技俩实现交换,绝对是很差的设计。

无论怎样,清楚的逻辑思维是很重要的。


#define swap(a,b)        \
  ( { typeof(*a) t = *a;   \
      *a = *b;             \
      *b = t;           ...


谢谢你给出更合理方法

论坛徽章:
0
10 [报告]
发表于 2009-04-19 16:00 |只看该作者
原帖由 mik 于 2009-4-18 00:28 发表
靠这种技俩实现交换,绝对是很差的设计。

无论怎样,清楚的逻辑思维是很重要的。


#define swap(a,b)        \
  ( { typeof(*a) t = *a;   \
      *a = *b;             \
      *b = t;           ...


同意你的观点,不过代码有点小问题,lz所给的宏里的参数不是指针。应该是这样:

#define swap(a,b) \
  ( { typeof(&a) pa = &a; \
      typeof(&b) pb = &b; \
      typeof(a) t = *pa; \
                 *pa = *pb; \
                 *pb = t; \
  } )


[ 本帖最后由 happy_flying 于 2009-4-19 20:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP