2009-08-25 42 views

回答

9

從最嚴格的意義上說,您可以依賴隱式轉換來布爾。向後兼容C需要它。

因此它成爲代碼可讀性的問題。代碼標準的目的通常是強制代碼風格的一致性,無論您是否同意風格。如果你正在考慮別人的標準,並想知道你是否應該將其納入自己的標準,那麼就去討論它 - 但如果這是你公司長期以來的規則,學會與之相處。

+0

是的,最壞的事情是有人跟着它,而其他人不是 – 2009-08-26 01:01:13

+0

是的,你可以依靠向'bool'的隱式轉換,就像你可以依賴運算符優先級,即使編譯器建議你放入冗餘括號(對於這兩種情況它認爲零概率規則將會改變的能力)。你甚至可以依賴隱式轉換來布爾來來咬你,只要你忘記在一個位置由於某種原因引用一個指針,例如重載一個'bool'值也是有意義的。 – 2017-04-27 10:06:38

0

這不會影響編譯後的代碼。

至於它有多麼有用 - 它肯定會有助於理解來自諸如Java/C#等語言的人們的理解。它會使你更清楚你正在檢查的內容。如果你開始將int與NULL進行比較(從而表明你對所討論的變量的類型朦朧),它會發出警告。我個人比較喜歡第一種形式,但這不是一個完全不合理的要求。

4

在大多數情況下,這並不可怕,但如果您輸入完全符合您的意思的值,則可以更具可讀性。

+0

我不能馬上找到一個參考,但我不認爲你說的是​​正確的。我認爲標準將NULL定義爲等於零。無論哪種方式,我都無法命名單個系統,但並非如此... – 2009-08-25 22:15:45

+0

在所有符合遠程標準的系統上,NULL都爲0(最多投射)。 一些深奧的實現可能會將指針0編譯爲0以外的值,但在代碼中它仍然爲0。 – 2009-08-25 22:16:03

+0

http://c-faq.com/null/ptrtest.html不同意。 – 2009-08-25 22:16:44

0

有時我覺得這個規則可以被打破,例如,處理標準庫返回int而不是bool(爲了與C89兼容)。

但是,這個規則通常會導致更容易理解的代碼。它甚至在像C#這樣的語言中強制執行,並且它沒有太多抱怨,所以除了必須習慣它之外,遵循此規則沒有主要的缺點。

0

增加零收益的規則是您可以有效刪除的規則。

+2

但也有好處,尤其是可讀性。僅僅因爲你不喜歡它並不意味着它沒有好處。 – 2009-08-25 22:18:02

+0

雖然它提高了可讀性? – jalf 2009-08-25 22:24:33

+0

我既不喜歡它也不喜歡它,只是不認爲它有一個合法的理由作爲一個規則存在。 您只能以可管理的編碼標準獲得約40或50條規則 - 不要浪費它們。 – soru 2009-08-25 22:25:01

0

我非常不喜歡這條規則。在C++中使用隱式轉換爲指針類型的布爾(當然還有布爾類型)是慣用的。國際海事組織,它是非常容易閱讀

bool conditionMet = false; 

while (!conditionMet) // read as "while condition is not met" 
{ 
    /* do something */ 
} 

比它是這樣說的:

bool conditionMet = false; 

while (conditionMet == false) // read as "while conditionMet is false" 
{ 
    /* do something */ 
} 

這對指針一樣。另外,通過引入不必要的比較,您將再次推出另一個錯誤輸入機會,並最終得到一個任務而不是比較,這當然會產生不希望的結果。在使用ints作爲bool的情況下,與舊的C代碼一樣,我認爲你也應該使用隱式轉換爲bool。

+1

我認爲'bool'類型不會強制任何東西(儘管編譯器可能做或不做)。對於指針類型,它更加灰暗。除此之外,你應該使用比較運算符。 – 2009-08-25 22:55:20

5

如果您想要使用隱式轉換爲bool的類(例如std::istream),則該規則將使您處於綁定狀態。這個代碼在從文件中每次讀取一個字,直到達到EOF:

std::ifstream file("foo.txt"); 
std::string word; 

while (file >> word) 
{ 
    // do stuff 
} 

流提取操作者返回到文件流,這是隱式轉換爲bool基準,以指示該流是否仍然處於狀態良好。當到達文件末尾時,測試失敗。您的編碼標準使您無法使用這種常見結構。

對於指針類型,這不是什麼大不了的事。編譯器可能會生成大致相同的代碼,以隱式轉換爲bool,並顯式測試NULL。在這一點上,這是一個品味問題 - 絕對沒有一個「更好」。編碼標準只是試圖執行一致的風格。

考慮到這一點,在處理內置類型(指針,整數等)時,應該完全遵循編碼標準。如果遇到與上述情況相似的情況,並且類別合法轉換爲bool,我會向您的隊友提出問題。

+0

應該指出的是,對於你所展示的結構是否是一個好主意,是否存在一些爭議。在重載操作符後面隱藏非類型轉換功能屬於「整潔技巧」的範疇,但它是否真的使事情更容易閱讀?還是它真的讓他們更難閱讀,直到你知道圖書館的詭計?與輸入和輸出流上的>>和<<運算符類似,在這種特殊情況下爲什麼按位運算會執行I/O操作?除非你知道這個訣竅,否則完全不可讀。 – 2009-08-25 23:09:05

+0

這是在線常見問題(http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.4),它是很常見的代碼,所以一個好的C++程序員需要能夠理解它。但我同意,我們可以在牛羣回家之前就其優點進行辯論。 :)它是OP編碼標準的一個方便的反例。 – 2009-08-25 23:16:28

+2

您可以在遵循以下規則的同時使用此功能:'while(static_cast (file >> word))'。此時,風格指南作者可能想要對規則進行重新說明:「不要依賴從條件中的指針到布爾的默認*隱式轉換,這可能是基於給出的示例首先要做的。或者他可能想要求'static_cast'在那裏,以提醒讀​​者轉換髮生。您不需要使用隱式轉換,以便使用轉換。 – 2009-08-26 10:04:03

-3

這是一個令人印象深刻的愚蠢規則。

if (ptr != NULL) // ok 

那麼爲什麼不

if ((ptr != NULL)==true) 
+7

因爲比較bools和bools是愚蠢的。比較一個指針和一個常量並不那麼重要。 – 2009-08-25 23:24:09

相關問題