do {} while (0) 主要在巨集定義後為語句中使用,比如:
#define macrofun(a, b, c) \
do while (0)
首先,我們定義乙個簡單的巨集:
#define safe_free(p) free(p); p = null;
那麼對於如下的**
if (null != p)
safe_free(p);
else
; // do something
就會被展開成
if (null != p)
free(p); p = null;;
else
; // do something
else找不到if
就算沒有else分支,p = null;無論如何都會執行,這和我們的邏輯不符
出現了兩個分號。
其實我們把巨集定義引用後面的分號刪掉,再把巨集定義後的語句用「{}」括起來也可以解決,也就是這樣:
#define safe_free(p)
if (null != p)
safe_free(p)
else
; // do something
就展開成了
if (null != p)
else
; // do something
好的,問題解決了,但是你看到上面的**不難受嗎???總想加個分號上去!而且我敲**的時候還得注意我到底呼叫的是函式,還是引用的巨集?分號到底加是不加?多累啊。
然而,使用 do {} while (0) 就完美解決了上面的所有問題。請看:
#define safe_free(p) do while (0)
if (null != p)
safe_free(p);
else
; // do something
就展開成了
第3章 流程控制語句
順序結構就是程式從上到下逐行地執行,中間沒有任何判斷和跳轉。if結構格式一 if 條件表示式 if結構格式二 格式二可以與三元運算子互換 if 條件表示式 else if結構格式三 if 條件表示式1 else if 條件表示式2 else if 條件表示式n else if巢狀if 1 switc...
第3章 Python常用語句
判斷語句 和c c 一樣,用if表示條件成立做一件事,條件不成立做一件事情。這個如果有基礎並不難,主要我想畫個圖出來!1 if語句和if else 語句 下面舉幾個例子 if表示如果,else表示否則,可以理解成成立做什麼,否則就怎麼樣,當然不一定要加else,但是如果有else一定要加if,在c ...
第3章 函式
變數本質上是佔位符 def 函式名 引數1,引數2,引數n 函式體 語句塊 這裡的引數沒有型別,只有物件才有型別。python中為物件編寫介面,而不是為資料型別編寫。result add 3,4 add x,y 被執行之前,在計算機內是不存在的,直到 執行到這裡的時候,在計算機中就建立起來了乙個物件...