C 语言有什么奇技淫巧?

关注者
9,724
被浏览
1,198,888
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

== C语言的黑魔法 ==

黑魔法一、

引用

贾扬清

的回答:

C有一个鲜为人知的运算符叫”趋向于”, 写作“-->”。比如说如果要实现一个倒数的程序,我们可以定义一个变量x,然后让它趋向于0...

C++有另一个更鲜为人知的运算符叫做“快速趋向于”,比如同样是从10到0,这里这么写

#include <stdio.h>

int main(void)
{
    int x = 10;
    while (0 <---- x) {
        printf("%d ", x);
    }
    return 0;
}

会打印出:

8 6 4 2


黑魔法二、

以下等式皆成立:

a[5] == 5[a];
"ABCD"[2] == 2["ABCD"] == 'C';

因为C语言的底层都是指针,数组的实现也是。对于compiler来说,它们木有区别:

*(a + 5) == *(5 + a)


黑魔法三、

问:以下这个语句是干啥的?

!ErrorHasOccured() ??!??! HandleError();

它叫

trigraph

,以上会被翻译为

!ErrorHasOccured() || HandleError();


黑魔法四、

下面这个打印是否让你惊奇?

#include <stdio.h>

int main(void)
{
    int x = 5;
    printf("%d and ", sizeof(x++)); // note 1
    printf("%d\n", x); // note 2
    return 0;
}

它会打印出:

4 and 5

因为 sizeof 是编译时行为,运行时不会执行

—————————————————

以上回答皆引用自:

Highest Voted 'c' Questions

—————————————————

UPDATE 2015.1.8

黑魔法五、(代码来自参与过的开源工程

ovs

,OpenFlow的业界标杆)

#define OFPACTS                                                         \
    /* Output. */                                                       \
    OFPACT(OUTPUT,          ofpact_output,      ofpact, "output")       \
    OFPACT(GROUP,           ofpact_group,       ofpact, "group")

#define OFPACT(ENUM, STRUCT, MEMBER, NAME)                              \
    BUILD_ASSERT_DECL(offsetof(struct STRUCT, ofpact) == 0);            \
                                                                        \
    enum { OFPACT_##ENUM##_RAW_SIZE                                     \
           = (offsetof(struct STRUCT, MEMBER)                           \
              ? offsetof(struct STRUCT, MEMBER)                         \
              : sizeof(struct STRUCT)) };                               \
                                                                        \
    static inline struct STRUCT *                                       \
    ofpact_get_##ENUM(const struct ofpact *ofpact)                      \
    {                                                                   \
        ovs_assert(ofpact->type == OFPACT_##ENUM);                      \
        return ALIGNED_CAST(struct STRUCT *, ofpact);                   \
    }
OFPACTS
#undef OFPACT

看懂以上代码的功能了吗?它定义了一些字段,然后再通过宏来批量生成函数和enum,狂拽酷炫!

学名叫做x macro,是节省冗余代码利器,好处是非常好用,跟机关枪一样;坏处是懂的人不多,大家看到一个没有被索引的ofpact_get_GROUP很容易就进入痴呆状态。

完整版的黑魔法五可以点这里

cowry/x_macro.c at master · geekan/cowry · GitHub

——————————

  • 占位待更新,想更新Qemu的狂拽酷炫的宏对象实现,有人支持吗~

——————————

UPDATE 2015/7/22

刚把废弃已久的博客架起来,发现以前还写过一点有意思的文章,欢迎延伸阅读: