2017-03-22 31 views
2

將邏輯運算結果相加是否可以(定義的行爲)?是否定義了添加邏輯運算結果的行爲

我可以做這樣的事情,如果我要計數大於零的數字?(或者是有沒有更好的辦法?)

int a[3] = {1,-5,3}; 
int result = 0; 
for(int i = 0 ; i<3; i++) 
{ 
    result += a[i]>0; 
} 
+3

'A [1]> 0'爲0或1是它的定義。 –

+0

是的,它是完美的代碼。所有布爾操作(如關係運算符)都保證返回值爲1或0的'int'。 – Lundin

回答

5

引用C11,章§6.5.8,(重點煤礦

運營商<(小於)中的每一個,>(大於),<=(小於或等於),和>= (大於或等於)如果指定的關係爲真,則將產生1,如果它是 ,則產生0107)結果的類型爲int

然後,你正在執行的化合物分配,其中,要求

對於運營商和+=-=,無論是左邊的操作數應是一個原子,合格,或 不合格指針到一個完整的對象類型,右邊應該有整數類型;或 左操作數應具有原子,合格或不合格的算術類型,並且右邊的 應具有算術類型。

並且您的表達式滿足約束條件。

所以是的,它是定義的行爲。


這就是說,從語法的角度來看,你是因爲默認的唯一安全operator precedence您的期望相符。這樣沒有問題,但明確的(因此肯定)從不傷害。

可以重寫表達式作爲

result += (a[i] > 0); 
+0

您知道在哪裏可以找到標準的相關部分嗎?或者你怎麼這麼快?^^ –

+0

@KamiKaze所有的操作員組都在第6.5章中列出,所以它只是打開pdf並點擊相關組的問題:) – Lundin

+0

@Lundin我想我會把下一本書我想閱讀並閱讀完整的標準。這樣我知道在哪裏可以找到什麼 –