2013-07-23 171 views
2

我需要初始化一個變量並測試它的值。 什麼是最有效的方法來做到這一點?在下一步中聲明和初始化的初始化有什麼區別?

char *key = get_key(item); 
if (key != NULL) { // do something } 

OR

char *key; 
if (key = get_key(item)) { // do something } 

做的副作用產生一些優勢或不? 謝謝!

+0

首先,第二個片段不是初始化。這是一項任務。 – 2013-07-23 15:47:14

回答

3

啊,好ol'「最有效的方法」... 號NOPE。忘記效率。

即使有差異,這很可能是不成熟的優化。但在這種特殊情況下,唯一的區別在於術語(你的第二個例子不是,在技術上說,初始化只是一個賦值表達式),而且你的編譯器幾乎肯定會在兩段代碼中生成相同的彙編程序。

0

對於您的具體示例,可能沒有區別。構建兩者並比較生成的代碼進行檢查。

0

獨立聲明(char *key;)完全不產生任何代碼,因此很可能兩個代碼片段都會生成相同的生成代碼,但可以證明,第一個片段稍微容易閱讀。

0

問問你自己效率是否重要。 (回答:極不可能)

爲了可讀性而去。考慮到這一點,在if條件下做一個賦值是有問題的,所以我強烈傾向於第一個版本。

2

在你的簡單程序中,要問的問題是:你會重用這個任務嗎?分配的成本將是一個內存存儲。如果完全不使用,那麼我只是不會增加商店的成本。編譯器可能是這樣做的,但不傷害以幫助它:-)

如果你打算重複使用密鑰,那麼我個人更喜歡不在if()中執行,而不是在聲明步驟中爲了可讀性。所以,我會採取第二種方式,但將作業保留在if()之外。

0

這兩個代碼片段在行爲上都是等效的。

我個人不喜歡第二個,因爲在if聲明的控制表達式中,副作用傾向於使代碼更不易讀,尤其是當使用賦值進行副作用時。這就是爲什麼像Python這樣的語言禁止在if語句的控制表達式中使用賦值運算符的原因之一(出現錯誤的傾向)。

這就是說,我也不喜歡在初始化時的副作用(第一個代碼片段中的聲明中的函數調用)。