== 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——————————
——————————
UPDATE 2015/7/22
刚把废弃已久的博客架起来,发现以前还写过一点有意思的文章,欢迎延伸阅读: