論理演算の結果を加算するのに問題はありませんか?私はゼロより大きな数字をカウントしたい場合論理演算の結果を加算するために定義された振る舞いです
私は?このような何かを行うことができます(またはより良い方法はありますか?)
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、(強調鉱山引用します)演算子<
(未満)の
それぞれ、
>
(より大きい)、<=
(以下)に等しく、及び>=
(より大きいか等しいです) は、指定されたリレーションがtrueの場合は1
、 の場合は0
となります。 107)結果には、タイプint
があります。
その後、あなたは事業者+=
だけ-=
については
、いずれかの左側のオペランドは、原子の資格、または 修飾されていないポインタでなければならないことが必要とされる化合物の割り当てを実行しています完全なオブジェクト型に、右は整数型になります。または左オペランドの は、アトミック、修飾、または非正規の算術型を持ち、右はは算術型でなければなりません。
あなたの式は制約を満たしています。
はい、それは定義された動作です。構文の観点から、あなたがあるため、デフォルトでのみ安全だ、と述べた
はoperator precedenceあなたの期待に一致します。そのような問題はありませんが、明白な(したがって、確かに)傷つくことはありません。
あなたは
result += (a[i] > 0);
標準の関連部分を頭の上のどこに見つけるか知っていますか?どのように速くすることができますか?^^ –
@カミカゼすべてのオペレータグループは6.5章に記載されていますので、pdfを開いて関連グループをクリックしてください:) – Lundin
@Lundin私は次の本を捨てると思います代わりに完全な標準を読んで読んでみたい。そのように私は何を見つけるかを知っています –
として式を書き換えることができます '[i]は> 0 'が0または1である。はい、それは定義されています。 –
はい、それは完璧なコードです。関係演算子などのすべてのブール演算は、値1または0のint型を返すことが保証されています。 – Lundin