设为首页 加入收藏

TOP

3.3.3 圆括号中的组合语句
2013-10-12 06:48:59 来源: 作者: 【 】 浏览:106
Tags:3.3.3 括号 组合 语句

3.3.3  圆括号中的组合语句

花括号"{...}"用于把变量声明和语句组合成一个复合语句(组合语句)或一个语句块,这样在语义上这些语句就等同于一条语句。组合语句的右花括号后面不需要使用分号。圆括号中的组合语句,即形如"({...})"的语句,可以在GNU C中当一个表达式使用。这样就可以在表达式中使用loop、switch语句和局部变量,因此这种形式的语句通常称为语句表达式。语句表达式具有如下形式:

({ int y = foo(); int z;
if (y > 0) z = y;
else z = -y;
3 + z; })
其中组合语句中最后一条语句必须是后面跟随一个分号的表达式。这个表达式("3 + z")的值即用做整个圆括号括住语句的值。如果最后一条语句不是表达式,那么整个语句表达式就具有void类型,因此没有值。另外,这种表达式中语句声明的任何局部变量都会在整块语句结束后失效。这个示例语句可以像如下形式的赋值语句来使用:
res = x + ({略……}) + b;
当然,人们通常不会像上面这样写语句,这种语句表达式通常都用来定义宏。例如内核源代码init/main.c程序中读取CMOS时钟信息的宏定义:
69 #define CMOS_READ(addr) ({ \   // 最后反斜杠起连接两行语句的作用。
70 outb_p(0x80|addr,0x70); \ // 首先向I/O端口0x70输出欲读取的位置addr。
71 inb_p(0x71); \    // 然后从端口0x71读入该位置处的值作为返回值。
72 })
再看一个include/asm/io.h头文件中的读I/O端口port的宏定义,其中最后变量 _v 的值就是inb()的返回值。
05 #define inb(port) ({ \
06 unsigned char _v; \
07 __asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
08 _v; \
09 })

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.3.1 C程序编译和链接 下一篇3.3.4 寄存器变量

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: