C语言小问题

问题源于一个宏定义

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场的管理。(2) 实现要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。(2) 实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(’A’,1,5)表示1号牌照车在5时刻到达,而(’D’,5,20)表示5号牌照车在20时刻离去。整个程序可以在输入信息为(’E’,0,0)时结束。本题可用顺序存储结构和链式存储结构来实现。本人的一个数据结构课程设计(用C++源码实现,供大家学习参考之用,有不妥之处望指正)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值