例解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
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
相关文章推荐
- (1)、JAVA 学习点滴、复合语句、表达式中的自动类型提升
- 例解GNU C之表达式中的复合语句
- 1.2复合表达式与if语句书写技巧
- 例解GNU C之表达式中的复合语句
- 例解GNU C之表达式中的复合语句
- 复合语句(compound statement)
- C#笔记(表达式、运算符和语句)
- //复合语句内定义变量
- awk使用详解(二)比较操作符、复合表达式、next命令及sdin输入
- C++---基础篇(运算符/表达式/控制语句)
- 【JS】表达式&语句
- 第4章 表达式和基本语句
- Shell脚本[运算表达式,条件控制语句]
- Python 程序;模块;语句;表达式;对象
- Python<5>赋值、表达式、打印语句
- 变量的值,类型,操作符,表达式和语句
- 第五章、运算符、表达式和语句
- SQL语句与正则表达式
- [C++ primer 学习笔记][05]表达式和语句
- C++学习笔记(二)--逻辑表达式,问号操作符,switch语句,break&continue,文件输入输出