2

a [8]はブール値の配列です。私はブール式を次のように計算しようとしています。*と+はそれぞれ&&と||に相当します。 onブールオペランド?

bool a[8]; 
..... 
bool result=a[0]*(a[3]+a[6]*(a[4]+a[7]*a[5]))+a[1]*(a[6]*a[3]+a[4]+a[7]*a[5])+a[2]*(a[5]+a[7]*(a[4]+a[6]*a[3])); 

表現は長いが概念的には何も複雑ではない。唯一のバグは、式の*を& &(いずれの場合も論理ANDが必要です)に置き換えるか、+を||に置き換えると結果が異なるようです。 (論理ORを期待する)。

どのようなものが正しいか、ブール演算子か、乗算、加算などの数学的な表記法はわかりません。何もエラーはありません。すなわち、コンパイラは両方に満足しています。どちらが安全で正しいですか?

+1

@EdHeal:答えを回答エリアに記入してください。 –

+0

まったく興味をそそられる特異性のためにアップアップされました。 – Bathsheba

答えて

8

ほとんど オペランドの場合と同じです。しかし、微妙な違いがあります。

  1. *+intタイプにbool型引数を広げます。

  2. a || bのタイプはboolであり、a + bintである。同義語は&&*です。 &&||であるのに対し、

  3. *+は、点の配列決定されていません。 &&||であるのに対し、

  4. *+は、短絡しません。

  5. オペレータ優先順位テーブルでは、非常に異なる位置を占めます。だから、代入は簡単ではありません。

  6. a場合はboolであり、そしてbboolあるがa || bの挙動が定義され、次いで初期化が、boolが、C++のトラップ表現を含有することができるのでa + b未定義あるれていません。同様の表現を&&*と呼びます。

  7. a + b + c + ...の非常に長いチェーンは、その動作が定義されていないintタイプをオーバーフローさせる可能性があります。

(3)a++ * a++が未定義の動作であるがa++ || a++ではないことを意味します。

(実際には関係ありませんが、注意してください:&&||は過負荷の場合に短絡特性を失います)。

+0

論理的に言えば、そうではありません; –

+0

はい、「論理的」は説明が難しいです。私は単にその言葉を錫メッキしました。 – Bathsheba

+0

また、オーバーフローにより、論理1から0へのフリップが発生する可能性があります。 – LogicStuff

5

ここで違いがない論理演算子の短絡に加えて、振る舞いの変化を説明する重要な違いはoperator precedenceです。

あなたが||、優先順位の変更の順​​で&&*、または+を交換

*+より 高い優先度を持っていますが、 &&+より 低く優先されます。そのため、 *&&に置き換えて、必要な操作順序を強制するために式を完全にかっこにする必要があります。あなたは同じ結果に終わるだろうので

&&||*+の両方を交換すると、同じ2つの演算子の相対的優先度を維持します。

+0

Upvoted;私は一度だけ私の答えを包括的にするように努力して、あなたの優先順位を盗んだことを告白します。 – Bathsheba

+0

私の答えには私の他のポイントを借りて自由に感じることができます:あなたの答えは私のために優れた品質になる傾向があります。 – Bathsheba

+0

@Bathshebaあなたの答えは、長期的にはより重要な質問のタイトルとの違いを説明しています。ある意味では、ここでは論理的および算術演算子を組み合わせて使用​​することはできません。それがOPのやっていることなので、この1つの点で彼の違いを説明します。他の人にとっては、他の6つのポイントがより適切です。 – dasblinkenlight

関連する問題