您的位置:首页 > 其它

例解GNU C之表达式中的复合语句

2014-10-18 20:32 120 查看
例解GNU C之表达式中的复合语句 - tanglinux - 博客频道 - CSDN.NET
http://blog.csdn.net/npy_lp/article/details/7015066
前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。

帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions



在讲解新概念之前,先回顾一下在标准C中表达式和复合语句的概念,表达式指的是运算符和操作数的组合,而复合语句指的是由一个或多个被括在花括号里的语句构成的代码块。

在GNU C中,允许用小括号括起来的复合语句出现在一个表达式中。

举例,如清单1:

[cpp] view
plaincopy

#include <stdio.h>



int main(void)

{

int a = ({ int b = 8;

int c = 99;

b + c;

b + c - 10;

});



printf("a = %d\n", a);



return 0;

}

例子输出结果:

[cpp] view
plaincopy

a = 97

注意,例子中a的值是复合语句中最后一个语句的值,并且它的数据类型与最后一个语句的数据类型相匹配。

这种特性(Statements and Declarations in Expressions)在Linux内核中常被用于宏的定义中。

举例,如清单2:

[cpp] view
plaincopy

/* linux-2.6.38.8/include/linux/kernel.h */

#define min(x, y) ({ \

typeof(x) _min1 = (x); \

typeof(y) _min2 = (y); \

(void) (&_min1 == &_min2); \

_min1 < _min2 ? _min1 : _min2; })



/* linux-2.6.38.8/include/linux/kernel.h *

* min_not_zero - return the minimum that is _not_ zero, unless both are zero

* @x: value1

* @y: value2

*/

#define min_not_zero(x, y) ({ \

typeof(x) __x = (x); \

typeof(y) __y = (y); \

__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })



#include <stdio.h>



int main(void)

{

printf("min_not_zero(4, 0) = %d\n", min_not_zero(4, 0));



printf("min_not_zero(\'\\0\', \'a\') = %c\n", min_not_zero('\0', 'a'));



return 0;

}

例子输出结果:

[cpp] view
plaincopy

min_not_zero(4, 0) = 4

min_not_zero('\0', 'a') = a
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: