计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions
在GNU C中,复合语句(compound statement)可以作为表达式,从而,你可以在表达式中使用循环,分支,局部变量等等。
表达式指的是运算符和操作数的组合,而复合语句指的是由一个或多个被括在花括号里的语句构成的代码块。
{
int y = foo ();
int z;
if (y > 0)
z = y;
else
z = - y;
}
我们可以将其改写成语句表达式,在外面加上一对圆括号,例如
({
int y = foo ();
int z;
if (y > 0)
z = y;
else
z = - y;
z;
})
注意,复合语句的最后一个语句,应该是一个表达式语句,即一个表达式,加上一个分号。这个表达式的值,将作为整个语句表达式的值。如果,最后一个语句是使用了其它种类的语句,那么整个结构将具有void类型,没有有效的值。
语句表达式的一种用法,是在宏定义中,保证操作数只被求值一次,从而避免副作用引起的错误。例如,
#define max(a,b) ((a) > (b) ? (a) : (b))
如果操作数a或者b有副作用,那么就会产生错误的结果。在GNU C中,可以利用语句表达式来避免这样的问题:
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
这里,假设知道a和b的int类型的。
再看看此语法在iOS开发Objetive-C中的妙用
self.myTableView = ({
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped];
tableView.delegate = self;
tableView.dataSource = self;
tableView;
});
这样炫酷的完成了tablview的初始化
优点很明显,表达式中使用循环,分支,局部变量,很好的控制代码的作用域,逻辑更加清晰
再来一条设置frame的类似语法技巧
UIView *view = [[UIView alloc]init];
view.frame = (CGRect) {
.size = {
.width = 200,
.height = 100,
},
.origin = {
.x = 200,
.y = 100,
}
};
view.frame = (CGRect) {22,122,522,33};
转载请注明:天狐博客 » iOS开发之Objetive-C复合语句表达式