C语言小问题
来源:互联网 发布:c语言&.2f是什么意思 编辑:程序博客网 时间:2024/06/05 05:34
问题源于一个宏定义
#define max(a,b) ({int _ =(a), __ =(b); _ > __ ? _ : __ })
也许——容许我瞎折腾一下
于是我开始修改代码,查看各种代码反馈的结果。
版本1
int a = 10, b = 100; int x = { int _=a, __=b; _ > __ ? _ : __; };
好吧,我把圆括号给删除了,于是编译器给我报错了。
error: expected expression before 'int' int _=a, __=b; ^
好吧,不能没有圆括号,虽然现在还不知道是为啥。。
然后我把圆括号还原后,又在里面添加了一句话。
版本2
int a = 10, b = 100; int x = ({ int _=a, __=b; _ > __ ? _ : __; int c = 100; });
然后我发现,编译不了。
错误是:
error: void value not ignored as it ought to be int x = ({ ^
好吧,大致意思就是圆括号里面的返回了void类型,不能被赋值给int类型。
为了验证我的这个猜想,我把代码改成了版本3的样子。
版本3
int a = 10, b = 100; ({ int _=a, __=b; double yy=a > b ? a:b; printf("%f\n", yy); _ > __ ? _ : __; int a; });
于是编译通过了。好吧,我应该猜对了,的确是返回了一个void。
但是我没有停止我的折腾,于是有了下面的代码。
版本4
int a = 10, b = 100; char x = ({ double _=a, __=b; double yy = a > b ? a:b; printf("%f\n", yy); _ > __? _ : __; });
好吧,编译竟然通过了,于是我不得不用printf查看x的值了(控制符是%d)。
然后我看到的结果是100,好吧也许是被强制转换了呢。
于是我大概可以总结了,这是一个类似于函数的写法。
大致是编译器最后一个语句当做表达式并将它的返回值当做类似于函数的返回值一样的东西给返回了
一点拙见,如果错误,欢迎指正。
也许的也许——容我乱想一下
好吧,也许我这么多的折腾最后换回来的一句话就是:lambda表达式。T^T不高兴。
以上。
0 0
- C语言小问题
- C语言小问题
- C语言小问题
- c语言小问题
- c语言小问题
- c语言小问题
- C语言小问题
- C语言中的小问题
- C语言小问题收集
- c语言相关小问题
- c语言的小问题
- C语言一些小问题
- C语言小问题集锦
- C语言----小问题记录
- C语言的小问题啊
- 碰见C语言的几个小问题
- 一些C语言的小问题
- 一个郁闷的C语言小问题
- 成功叛逃到hexo
- spring+jdbc
- SiteMesh基本用法及示例
- Java XML和IO流
- acm-hdu5265解题报告
- C语言小问题
- 联想y470p 使用Win8.1若干问题
- 习题3-40
- 2015061103 - apache httpclient jar包下载地址
- 认识自己——当断则断
- 教程:一分钟完成SiteMesh Template模板组合
- 斯坦福大学iOS开发公开课总结
- IOS-多线程
- 浅谈jsp、freemarker、velocity区别