Chinaunix首页 | 论坛 | 博客
  • 博客访问: 669319
  • 博文数量: 183
  • 博客积分: 9166
  • 博客等级: 中将
  • 技术积分: 1920
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-31 16:17
文章分类

全部博文(183)

文章存档

2010年(159)

2009年(24)

分类: C/C++

2010-03-29 21:02:03

在GNU中, 通过在一个复合语句外加一对圆括号, 可以产生一个返回值. 如下面的表达式就返回8:
  1. ret = ({
  2.                 int a = 5;
  3.                 int b;
  4.                 b = a + 3;
  5.       });

返回的值就是语句块中的最后一个语句的返回值.
这种结构在写宏的时候很有用. 比如
  1. #define even(x) (2*(x/2) == x ? x : x + 1)

这是对x取整的. 如果在调用时使用even(i++)这种方式的话, 则会得出错误的结果. 
但是如果使用下面的方法:
  1. #define even(x)\
  2. ({\
  3.         int y = x;\
  4.         (2*(y/2) == y ? y:y+1);\
  5. })

这样的话, 使用even(i++)也可以得到正确的结果.
阅读(711) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~