例解GNU C之表达式中的复合语句
2014-04-05 15:26
393 查看
/article/2766844.html
前言:计算机语言是编译器和程序员交流的依据和规范,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
前言:计算机语言是编译器和程序员交流的依据和规范,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
相关文章推荐
- 例解GNU C之表达式中的复合语句
- 例解GNU C之表达式中的复合语句
- 摘自GNU C中的语句表达式
- 1.2复合表达式与if语句书写技巧
- GNU C 的复合语句
- 例解GNU C之表达式中的复合语句
- (1)、JAVA 学习点滴、复合语句、表达式中的自动类型提升
- 运算符,表达式,语句
- 读书笔记-高质量C++/C编程指南-第4章 表达式和基本语句
- LCC编译器的源程序分析(61)复合语句的代码块流程
- c语言基础(5)--运算符,表达式和语句
- oracleday19(复合类型 游标变量 pl/sql 进阶 条件分支语句 loop )
- python笔记5 - 字符串格式化表达式,while语句嵌套,for循环,break,continue,死循环
- Python学习笔记(八):Python语句简介、赋值、表达式和打印
- 不要在复合表达式中使用++等操作符
- 正则表达式使用语句
- 高质量C /C编程指南---第4章 表达式和底子语句
- MySQL 创建主键,外键和复合主键的语句
- 高质量C++/C编程指南 -- 第4章 表达式和基本语句
- python语句表达式——黑板客老师课程学习