对 C 语言的学习总是时断时续,刚刚又重新看一本入门书籍《明解 C 语言》。学到条件运算符时做了这个实验:
printf("%d\n", (2 < 3) ? (no = 2) : (no = 3));
输出 2,这个是没有什么问题的。然后我修改了一下:
printf("%d\n", (2 < 3) ? ({no = 2; no = 1;}) : (no = 3));
输出变成了 1,也就是说表达式 ({no = 2; no = 1;}) 的值为 1。再修改一下:
printf("%d\n", (2 < 3) ? ({no = 2; no = 1; if (1) no = 0;}) : (no = 3));
无法编译。然后我把顺序调一下后:
printf("%d\n", (2 < 3) ? ({no = 2; if (1) no = 1; no = 0;}) : (no = 3));
成功输出 0。
通过上面的实验,可以看到 C 语言中的表达式非常灵活,即使里面有多个语句。不过有一个条件,那就是里面的复合语句的最后一条语句得是表达式语句,这样就可以将最后的表达式的值作为整个表达式的值了。
对于其它像 switch、do、while的结果和 if 一样,不能作为最后一条语句。然而对于函数去不一样了,如果函数有返回值,那么这个函数调用语句就可以在最后面:
int f1 () { return 1;}
printf("%d\n", ({f1();}));
输出 1。而:
void f2 () { return;}
printf("%d\n", ({f2();});
无法编译。
我猜想只要语句有返回值,那么它就可以作为 ({}) 里面的最后一条语句,并且这个表达式返回的值就是最后语句的值。
原文:http://www.cnblogs.com/huaguoshanworld/p/3653152.html