当前位置: 华文星空 > 知识

C 语言有什么奇技淫巧?

2015-02-08知识

== 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

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

  • C语言的奇技淫巧