我發現下面的規則在coding standards sheet:C++依賴隱式轉換爲bool條件?
不要依賴隱式轉換的條件爲bool。
如果(PTR)//錯誤
如果(PTR!= NULL)// OK
如何合理/有用的是這個規則?
編譯代碼有多少過載?
我發現下面的規則在coding standards sheet:C++依賴隱式轉換爲bool條件?
不要依賴隱式轉換的條件爲bool。
如果(PTR)//錯誤
如果(PTR!= NULL)// OK
如何合理/有用的是這個規則?
編譯代碼有多少過載?
從最嚴格的意義上說,您可以依賴隱式轉換來布爾。向後兼容C需要它。
因此它成爲代碼可讀性的問題。代碼標準的目的通常是強制代碼風格的一致性,無論您是否同意風格。如果你正在考慮別人的標準,並想知道你是否應該將其納入自己的標準,那麼就去討論它 - 但如果這是你公司長期以來的規則,學會與之相處。
這不會影響編譯後的代碼。
至於它有多麼有用 - 它肯定會有助於理解來自諸如Java/C#等語言的人們的理解。它會使你更清楚你正在檢查的內容。如果你開始將int與NULL進行比較(從而表明你對所討論的變量的類型朦朧),它會發出警告。我個人比較喜歡第一種形式,但這不是一個完全不合理的要求。
在大多數情況下,這並不可怕,但如果您輸入完全符合您的意思的值,則可以更具可讀性。
我不能馬上找到一個參考,但我不認爲你說的是正確的。我認爲標準將NULL定義爲等於零。無論哪種方式,我都無法命名單個系統,但並非如此... – 2009-08-25 22:15:45
在所有符合遠程標準的系統上,NULL都爲0(最多投射)。 一些深奧的實現可能會將指針0編譯爲0以外的值,但在代碼中它仍然爲0。 – 2009-08-25 22:16:03
http://c-faq.com/null/ptrtest.html不同意。 – 2009-08-25 22:16:44
有時我覺得這個規則可以被打破,例如,處理標準庫返回int
而不是bool
(爲了與C89兼容)。
但是,這個規則通常會導致更容易理解的代碼。它甚至在像C#這樣的語言中強制執行,並且它沒有太多抱怨,所以除了必須習慣它之外,遵循此規則沒有主要的缺點。
我非常不喜歡這條規則。在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。
我認爲'bool'類型不會強制任何東西(儘管編譯器可能做或不做)。對於指針類型,它更加灰暗。除此之外,你應該使用比較運算符。 – 2009-08-25 22:55:20
如果您想要使用隱式轉換爲bool
的類(例如std::istream
),則該規則將使您處於綁定狀態。這個代碼在從文件中每次讀取一個字,直到達到EOF:
std::ifstream file("foo.txt");
std::string word;
while (file >> word)
{
// do stuff
}
流提取操作者返回到文件流,這是隱式轉換爲bool
基準,以指示該流是否仍然處於狀態良好。當到達文件末尾時,測試失敗。您的編碼標準使您無法使用這種常見結構。
對於指針類型,這不是什麼大不了的事。編譯器可能會生成大致相同的代碼,以隱式轉換爲bool
,並顯式測試NULL
。在這一點上,這是一個品味問題 - 絕對沒有一個「更好」。編碼標準只是試圖執行一致的風格。
考慮到這一點,在處理內置類型(指針,整數等)時,應該完全遵循編碼標準。如果遇到與上述情況相似的情況,並且類別合法轉換爲bool
,我會向您的隊友提出問題。
應該指出的是,對於你所展示的結構是否是一個好主意,是否存在一些爭議。在重載操作符後面隱藏非類型轉換功能屬於「整潔技巧」的範疇,但它是否真的使事情更容易閱讀?還是它真的讓他們更難閱讀,直到你知道圖書館的詭計?與輸入和輸出流上的>>和<<運算符類似,在這種特殊情況下爲什麼按位運算會執行I/O操作?除非你知道這個訣竅,否則完全不可讀。 – 2009-08-25 23:09:05
這是在線常見問題(http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.4),它是很常見的代碼,所以一個好的C++程序員需要能夠理解它。但我同意,我們可以在牛羣回家之前就其優點進行辯論。 :)它是OP編碼標準的一個方便的反例。 – 2009-08-25 23:16:28
您可以在遵循以下規則的同時使用此功能:'while(static_cast
這是一個令人印象深刻的愚蠢規則。
if (ptr != NULL) // ok
那麼爲什麼不
if ((ptr != NULL)==true)
因爲比較bools和bools是愚蠢的。比較一個指針和一個常量並不那麼重要。 – 2009-08-25 23:24:09
是的,最壞的事情是有人跟着它,而其他人不是 – 2009-08-26 01:01:13
是的,你可以依靠向'bool'的隱式轉換,就像你可以依賴運算符優先級,即使編譯器建議你放入冗餘括號(對於這兩種情況它認爲零概率規則將會改變的能力)。你甚至可以依賴隱式轉換來布爾來來咬你,只要你忘記在一個位置由於某種原因引用一個指針,例如重載一個'bool'值也是有意義的。 – 2017-04-27 10:06:38