2010-04-29 60 views
2

我只是想知道這將是更好地做到這一點:規則優先==超過=

if((fd = open(filename, O_RDWR)) == -1) 
{ 
fprintf(stderr, "open [ %s ]\n", strerror(errno)); 

return 1; 
} 

或本

fd = open(filename, O_RDWR); 
if(fd == -1) 
{ 
    fprintf(stderr, "open [ %s ]\n", strerror(errno)); 

    return 1; 
} 

非常感謝您的任何建議,

+2

您在第二個示例中似乎有一個括號匹配問題 – 2010-04-29 02:55:47

+2

第一個選項很好,按預期工作,並且相當常見。 – meagar 2010-04-29 02:56:15

+0

@Mark - 現在修復 – ant2009 2010-04-29 02:58:01

回答

12

Yuck,把它分開。通過將所有內容混合在一行中獲得什麼?讓我們來比較和對比:

單行:

  • 優點:
  • 缺點:難以閱讀,容易出錯。 (考慮你的第一次修訂。)

多行:

  • 優點:易於閱讀,容易出錯少。
  • 缺點:

我認爲這是明顯的。 :)


「有時候把它放在一個行更有意義,例如:while ((c=getchar())!=EOF)

這很好,但這裏是不是這樣的。有分別是時不分解更合理,但一般,不要。


,當一行被殺死你看到的功能的能力「這樣可以節省更多的垂直空間」

,你需要1)買與分辨率的顯示器比640×480高,2)寫小功能。

真的,我已經從未理解爲任何參數,函數應該容易適合在任何屏幕上,無論一行差異。


「多行使它看起來複雜」

不是真的,順手就在同一行無疑是難以閱讀和更復雜的期待。將事物拆分可以簡化一次處理一個數據的過程,但不應該假設兩行使其複雜一倍。

+0

我認爲它更具可讀性並且具有多行。 – ant2009 2010-04-29 02:59:04

+0

人們經常錯誤地認爲,少些線條以某種方式使其更好。 – Matt 2010-04-29 03:05:24

+3

我已經爭辯過同樣的結論,但爲了扮演魔鬼的擁護者,我會說單線的優點在於它是慣用的。 C人確切地知道你在做什麼並且始終這樣做 – frankc 2010-04-29 03:15:42

2

它是一種風格的東西 - 你不是問優先級(不是主持人)。

很多人會認爲後者的例子更清晰。

1

這是一個風格問題,是主觀的。他們做同樣的事情。我傾向於更喜歡後者,因爲我發現它更易於閱讀,並且更容易在調試器中設置斷點/檢查變量。

3

也許在括號使排序明顯嗎?

if((fd = open(filename, O_RDWR)) == -1) 
2

除了標準的成語 - 那些是很常見的,每個人都立即得到你正在嘗試做的事情 - 我會避免做在有條件的分配。首先,閱讀起來比較困難。其次,在條件檢查中,通過使用錯誤的賦值運算符來創建錯誤(至少在弱類型語言中將零解釋爲false和非零)。

2

第二個爲了可讀性更好,但我知道我經常做第一個。優先考慮=運營商,尤其是因爲您將其用引號括起來,從而允許指定的值返回&,與==運營商進行比較。

0
(-1 == __whatever__) 

減少錯字

6

有幾個人贊成第二種的主張。我不同意他們。雖然(顯然)最初有一個小問題===在第一個,我認爲這是一個小問題。

一個更大的問題是,人們(尤其是如果他們急於)忽略錯誤檢查 - 完全忽略if (whatever == -1),通常根據他們正在工作的理論上快速,一次性代碼和檢查錯誤是不是真的需要。這真是壞習慣;我幾乎可以保證每個讀過這個的人都看到真的這樣的代碼跳過錯誤檢查,即使它確實應該有它。

在這樣的代碼中,試圖打開文件並檢查是否有錯誤,因此應該與不可約束地綁定在一起。將兩者置於同一聲明中反映了正確的意圖。將兩者分開顯然是錯誤的 - 他們應該以任何方式在任何時間出於任何原因以任何方式分離而不是。這應該被編碼爲單個操作,因爲它應該是的單個操作。它應該始終被認爲和編碼爲一個單一的操作。

在我看來,這樣做的藉口是相當薄弱的。實際情況是,任何使用C 的人都需要才能閱讀將條件測試與條件測試相結合的代碼。只是一個明顯的例子,像while ((ch=getchar()) != EOF)幾乎需求循環寫入作爲組合的分配和測試 - 在嘗試測試EOF分別通常會導致代碼,只是不能正常工作,如果你這樣做使它工作正常,代碼要複雜得多。

同樣,-==的問題。由於我沒有看到缺陷開始,所以我不確定這兩個人爲了避免問題而做了多少分離,但我的直接猜測是,它可能幾乎沒有任何區別。編譯器會提醒你什麼時候應該是一個條件只包含一個任務已經存在多年(如gcc)。在大多數情況下,無論如何,症狀幾乎立即顯而易見 - 簡而言之,事實上,您在本帖的某一部分中犯了特定錯別字,但沒有證明其中的任何部分(甚至無法表明)兩者的困難。基於這種證據,我顯然認爲「不」比「立即」更難打字,因爲我只是在沒有問題的情況下鍵入「立即」,但必須糾正「不」(兩次以上),沒有更少),然後纔出現在前面的句子中。我很確定,如果我們錯誤地多次輸入它,「這個」是英語中最難的單詞。

3

在這個例子中,我會加入合唱團,說第二種方法更好。

更艱鉅的情況是,當它在一個循環中,如:

while ((c=getchar())!=-1) 
{ 
    ... do something ... 
} 

while (true) 
{ 
    c=getchar(); 
    if (c==-1) 
    break; 
    ... do something ... 
} 

在這樣的情況下,我寧願做在同一行,因爲那時它明確是什麼控制循環,我認爲這會覆蓋賦值和測試複雜組合的缺點。

+0

你的第一種方式(他的第二種方式)對於一個while循環來說非常正常。 – 2010-04-29 04:07:50

+0

@Ken:恩,是的。我並沒有試圖說我認爲我剛發明了這個想法。只是投票,我認爲這是在WHILE語句中的好風格,但在IF語句中風格不好。 – Jay 2010-04-29 04:15:30

+0

我不是故意暗示你以爲。我只是補充說:「這不僅僅是一個好主意:它是約定」。 – 2010-04-29 13:57:00

0

第一種情況是非常正常在編寫輸入循環時是正常的,因爲替代方法是必須將輸入命令寫兩次 - 一次在循環之前,一次在循環結尾。

while ((ch=getchar()) != -1){ 
    //do something with it 
} 

我認爲第二種方法對於if語句更爲正常,在這種情況下,您沒有同樣的擔憂。

+0

你可以這樣做(ch = getchar(),ch!= -1)。 – Spidey 2012-04-12 19:02:41