將邏輯運算結果相加是否可以(定義的行爲)?是否定義了添加邏輯運算結果的行爲
我可以做這樣的事情,如果我要計數大於零的數字?(或者是有沒有更好的辦法?)
int a[3] = {1,-5,3};
int result = 0;
for(int i = 0 ; i<3; i++)
{
result += a[i]>0;
}
將邏輯運算結果相加是否可以(定義的行爲)?是否定義了添加邏輯運算結果的行爲
我可以做這樣的事情,如果我要計數大於零的數字?(或者是有沒有更好的辦法?)
int a[3] = {1,-5,3};
int result = 0;
for(int i = 0 ; i<3; i++)
{
result += a[i]>0;
}
引用C11
,章§6.5.8,(重點煤礦)
運營商
<
(小於)中的每一個,>
(大於),<=
(小於或等於),和>=
(大於或等於)如果指定的關係爲真,則將產生1
,如果它是 ,則產生0
。 107)結果的類型爲int
。
然後,你正在執行的化合物分配,其中,要求
對於運營商和
+=
僅-=
,無論是左邊的操作數應是一個原子,合格,或 不合格指針到一個完整的對象類型,右邊應該有整數類型;或 左操作數應具有原子,合格或不合格的算術類型,並且右邊的 應具有算術類型。
並且您的表達式滿足約束條件。
所以是的,它是定義的行爲。
這就是說,從語法的角度來看,你是因爲默認的唯一安全operator precedence您的期望相符。這樣沒有問題,但明確的(因此肯定)從不傷害。
可以重寫表達式作爲
result += (a[i] > 0);
您知道在哪裏可以找到標準的相關部分嗎?或者你怎麼這麼快?^^ –
@KamiKaze所有的操作員組都在第6.5章中列出,所以它只是打開pdf並點擊相關組的問題:) – Lundin
@Lundin我想我會把下一本書我想閱讀並閱讀完整的標準。這樣我知道在哪裏可以找到什麼 –
'A [1]> 0'爲0或1是它的定義。 –
是的,它是完美的代碼。所有布爾操作(如關係運算符)都保證返回值爲1或0的'int'。 – Lundin