2015-10-11 78 views
0

在編寫複雜邏輯檢查時,我無法理解C++中的運算符分組。 基本上,我只是擔心,如果這個代碼:三元運算符:異常拋出和嵌套

int getIndex(int i) throw(Exception) { 
    return (i >= 0 && i < length) ? array[i] : throw IndexOutOfBoundsException(); 
} 

是相同的,因爲這一個:

int getIndex(int i) throw(Exception) { 
    return i >= 0 && i < length ? array[i] : throw IndexOutOfBoundsException(); 
} 

此外,我不確定是什麼限制,而嵌套三元運營商,因爲我想做這樣的事情:

int getIndex(int i) throw(Exception) { 
    return (i >= 0 && i < capacity) ? ((i < length) ? (array[i]) : (throw IndexOfEmptyFieldException();) : (throw IndexOutOfBoundsException();)) 
} 

但(當然)我希望它能正常工作,也是可讀的。

如果你認爲這是使用三元運算符的壞榜樣,我應該只使用if/else或一些其他的方法,避免結構像這樣的未來?

+2

使用三元表達式有兩個問題,第一個也是最明顯的是可讀性/可維護性方面。第二個是表達式的兩個分支必須返回相同的類型,而不是。事實上,你的一個分支根本不會返回。 –

+0

@JoachimPileborg它編譯,雖然我沒有嘗試運行它。此外,此異常的catch塊會終止程序。 –

+0

嵌套三元組如何增加可讀性?如果存在多個條件,我肯定會更喜歡if/else – user463035818

回答

2

? :優先級低於&&,所以是的,你的前兩個例子是等價的。

至於你的第三個例子,我會寫,隨着

int getIndex(int i) throw(Exception) { 
    return 
     i < 0 || i >= capacity ? throw IndexOutOfBoundsException() : 
     i >= length   ? throw IndexOfEmptyFieldException() : 
     array[i] 
    ; 
} 

我認爲「嵌套」有條件的運營商都很好,只要他們是「系列化」,即它們形成,如果數額是多少,一個/ elsif/else鏈。

雖然這種特殊情況是有爭議的,因爲只有一個分支實際返回一個值。另外兩個只是拋出一個異常,而且通常作爲一個單獨的語句更好:拋出異常沒有真正的價值作爲表達式;它僅用於其副作用。