2014-10-08 41 views
-1

如何將下列代碼轉換爲單行?c中的單個語句中的指定和比較

int *i; 
i = some_func_ret_int_ptr(); 
if(!i) 
{ 
    // do something 
} 
// Will use i later 

我想要做像做

if((i=some_func_ret_int_ptr) && !i) 
{ 
    //do something 
} 
// Will use i later 

但是我在這裏浪費了一個比較。我有更好的方法來做到這一點嗎? 所有我想要的是如果只比較我的作業和比較。

+3

如果你剛剛學習C語言,那麼不要嘗試花哨/複雜的語法。你只會迷惑自己。並且讓任何不幸的人在之後需要處理你的代碼時更難以維護。 – 2014-10-08 21:35:51

+0

我是長期的c用戶。在一個文件中15-20個地方做類似的事情,所以想要寫更好的文字 – 2014-10-08 21:39:02

+0

爲清晰起見,而不是簡潔。無論如何,它會編譯到相同的二進制文件,所以讓其他人的生活更輕鬆。 – 2014-10-08 21:40:43

回答

2

除了什麼是在其他的答案建議你也可以做到這一點作爲

if (i = some_func_ret_int_ptr(), !i) 
{ 
    // do something 
} 

這是您最初的文字實現,將語句序列替換爲由,運算符分隔的表達式序列。

雖然這並沒有多大的實際意義。

+1

你可以用'if(!(i = ...)'表示同樣的東西' – dom0 2014-10-08 21:58:57

+0

@ dom0:是的,你可以。或者你可以按我的建議去做。 – AnT 2014-10-08 21:59:29

1

你可以做

if(!(i = some_func_ret_int_ptr())) 
{ 
     ... 
} 

什麼在此代碼發生,依序爲:

  1. some_func_ret_int_ptr()返回值被分配到i
  2. !i檢查
  3. 聲明
  4. if i == 0if裏面的內容會被執行,否則它會被執行不會
+0

我指出我需要將值存儲在i中。稍後將在代碼中使用它。 – 2014-10-08 21:36:35

+1

@SiddharthL這確實將返回值存儲在'i'中;你可以在'if'條件下有一個賦值語句。 – 2014-10-08 21:47:49

+0

@JohnBode我的回覆是在編輯之前。在回覆的代碼是if(!some_func_ret_int_ptr()) – 2014-10-08 22:14:10

6

隨着C,這是因爲你可以儘可能高爾夫吧:

int *i; 
if(!(i = some_func_ret_int_ptr())) 
{ 
    // do something 
} 
// Will use i later 
+3

呵呵?它在功能上等同於您提供的代碼。它只會評估賦值失敗(或賦值爲0)。 – RPGillespie 2014-10-08 21:38:39

+0

@Siddharth:「賦值成功」是什麼意思?如何賦值「成功」或「不成功」? – AnT 2014-10-08 22:20:55

1

清潔和可讀性:

int * i = some_func_ret_int_ptr(); 

if (!i) { /* ... */ } 
+0

這是怎麼回答的?與我已有的不一樣嗎?從int * i開始;暗示它們之間有一些代碼。另外,C代碼中的混合聲明會給你錯誤。 – 2014-10-08 23:23:06

+1

@Siddharth「lint」來自cc的時候廢話和有人做了皮棉,而不是給cc更好的警告。現在cc有很好的警告,所以沒有任何意義。無論如何,混合聲明是一件好事。 – 2014-10-09 00:01:06

0

尚未提及的一個選項是:

if (NULL != (i = some_func())) 

使用針對NULL明確的對比使得它很容易讀取該代碼的意圖。特別是考慮到你的功能名稱中可能不會有ret_int_ptr

+0

是的,函數名稱只是爲了解釋僞代碼 – 2014-10-10 01:37:30