C语言小问题

题记:生命的乐趣在于折腾

问题源于一个宏定义

1
#define max(a,b) ({int _ =(a), __ =(b); _ > __ ? _ : __ })

也许——容许我瞎折腾一下

于是我开始修改代码,查看各种代码反馈的结果。

版本1

1
2
3
4
5
int a = 10, b = 100;
int x = {
int _=a, __=b;
_ > __ ? _ : __;
};

好吧,我把圆括号给删除了,于是编译器给我报错了。

1
2
3
error: expected expression before 'int'
int _=a, __=b
;

^

好吧,不能没有圆括号,虽然现在还不知道是为啥。。

然后我把圆括号还原后,又在里面添加了一句话。

版本2

1
2
3
4
5
6
int a = 10, b = 100;
int x = ({
int _=a, __=b;
_ > __ ? _ : __;
int c = 100;
});

然后我发现,编译不了。

错误是:

1
2
3
error: void value not ignored as it ought to be
int x = ({
^

好吧,大致意思就是圆括号里面的返回了void类型,不能被赋值给int类型。
为了验证我的这个猜想,我把代码改成了版本3的样子。

版本3

1
2
3
4
5
6
7
8
int a = 10, b = 100;
({
int _=a, __=b;
double yy=a > b ? a:b;
printf("%f\n", yy);
_ > __ ? _ : __;
int a;
});

于是编译通过了。好吧,我应该猜对了,的确是返回了一个void。

但是我没有停止我的折腾,于是有了下面的代码。

版本4

1
2
3
4
5
6
7
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不高兴。

以上。