== 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
剛把廢棄已久的網誌架起來,發現以前還寫過一點有意思的文章,歡迎延伸閱讀: