當前位置: 華文星空 > 知識

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語言的奇技淫巧