2016-05-05 57 views
0

比方說,我們有一個變量:是「!」 intsead的「== 0」來檢查int是否是0好的做法?

是不是好做的

if(!a) 
{ 
    // do some stuff 
} 

代替

if(a == 0) 
{ 
    // do some stuff 
} 

?因爲它有效。

在第一個例子中,int會變成一個bool,那麼沒有static_cast<bool>(a)就可以嗎?另外如果a大於1會發生什麼?

+1

_「是否可以做 'if(!a)'」_當然。 –

+3

從技術上講,所有條件句都是'if' /'while'/etc。甚至不需要'bool'。它們只能轉換爲整數值,然後,如果值等於零 - 則將其視爲錯誤,否則視爲錯誤。但是,由於更好的可讀性,我個人更喜歡'if(a == 0)'。此外,關於「良好行爲」的問題總是基於意見。 –

+2

當然,它的工作原理和它的標準都有很好的定義 - 有一個從int到bool的轉換,其中0被認爲是false,非零被認爲是true。但是請記住,你正在爲其他人(包括你自己的未來)編寫代碼來閱讀。寫'if(a == 0)'是一個更明確的意圖聲明。經驗豐富的程序員會正確地解釋「if(!a)」,但是您提出這個問題的事實突出顯示了當您的陳述不能反映您的高層意圖時,它會產生多大的問題。 – Andrew

回答

5

在第一個例子中,int將變成一個bool,那麼沒有static_cast<bool>(a)就可以嗎?

是的,沒關係。將會有一個隱式轉換。

另外如果a大於1會發生什麼?

任何非0值都可以隱式轉換爲true。相反,只有0值纔會被視爲false

您應該選擇哪種方式?兩者都很好。我喜歡用我的代碼表達我的意圖。如果我只希望如果運行語句時a等於0時,我更喜歡

if (a == 0) 

爲表明正是我想要的。

+1

我同意。而且,無論選擇什麼,都要保持一致。 – edmz

+0

@black完全。一致地使用結構,縮進和空白是非常重要的。 – NathanOliver

0

這是有效的,人們使用它,但我認爲它遠離良好的做法。它給出了關於值的語義的錯誤觀念。

0通常被視爲falsy,但這更像是C天的遺物而非其他任何東西。較新的語言甚至不允許使用它,因爲它誤導了讀者對代碼的價值。

+0

_「0通常被視爲虛假,但更多的是來自C天的遺蹟」_不,0是錯誤的,1是真的,因爲它來自布爾代數。 – edmz

+3

不,布爾代數不知道「0」和「1」,它只知道「true」和「false」。有時將「0」和「1」用作這些的簡寫值,但它們在概念上完全不同。 –

相關問題