首页 > 其他 > 详细

有意思的 C 表达式

时间:2014-04-09 14:03:12      阅读:353      评论:0      收藏:0      [点我收藏+]

对 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();});

无法编译。

我猜想只要语句有返回值,那么它就可以作为 ({}) 里面的最后一条语句,并且这个表达式返回的值就是最后语句的值。

有意思的 C 表达式,布布扣,bubuko.com

有意思的 C 表达式

原文:http://www.cnblogs.com/huaguoshanworld/p/3653152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!