9

つまり、JavaやC#のような言語には、ビット演算子と論理演算子の両方があります。

論理演算子はブールオペランドでのみ意味があり、ビット演算子は整数型でも機能します。Cにはブール型がなく、ゼロ以外のすべての整数をtrueとして扱うため、論理演算子とビット演算子の両方が存在することは理にかなっています。ただし、JavaやC#などの言語にはブール型があるため、コンパイラは型のコンテキストに応じて適切な種類の演算子を自動的に使用できます。

では、これらの言語で論理演算子とビット演算子の両方を使用する具体的な理由はありますか?それとも、親しみやすさの理由で含まれているだけですか?

(ブール値のコンテキストで「ビット単位」演算子を使用してJavaとC#の短絡を回避できることは承知していますが、そのような動作は必要なかったので、ほとんど使用されていない特殊なケースである可能性があります)

4

6 に答える 6

6

1)これらの言語で論理演算子とビット演算子の両方を使用する具体的な理由はありますか?

はい:

  • ブール値に対してブール論理を実行するためのブール演算子があります。
  • (整数値に対して) ビットごとのロジックを実行するためのビットごとの演算子があります。

2) Java および C# での短絡を回避するために、ブール コンテキストで「ビット単位の」演算子を使用できることを認識しています。

C# に関する限り、これは単に真実ではありません。
C# には、たとえば 2 つのブール AND 演算子&(full) と&&(short) がありますが、ブール値のビット演算は許可されていません。

したがって、論理演算子とビット単位演算子の間に「重複」や冗長性はありません。この 2 つは同じタイプには当てはまりません。

于 2013-01-01T21:06:43.947 に答える
3

C# でブール値を使用

  • && は短絡論理演算子です
  • & は非短絡論理演算子です

ビットごとに、C / C ++のレガシー構文として & を使用するだけです....しかし、実際にはまったく異なります。どちらかといえば、混乱を避けるために、まったく別のシンボルとして使用する方がよいでしょう。しかし、&&& または ||| を使用したい場合を除き、あまり多くは残っていません。しかし、それは少し醜いです。

于 2013-01-01T21:07:21.083 に答える
2

私はJavaのために言います

  • 論理演算子はブール値を持つユーザーであり、ビット単位の演算子は int で使用されます。それらを混在させることはできません。
  • 「&」や「|」などの 1 つの演算子に減らしませんか? Java は C/C++ ユーザーにとって使いやすいように設計されているため、C/C++ ユーザーに適した構文になっています。最近では、下位互換性のため、これらの演算子を減らすことはできません。
于 2013-01-01T21:05:56.360 に答える
2

&すでに述べたように、 と の間にはいくつかの違い&&があるため ( と についても同様|です||)、2 組のブール演算子が必要です。さて、上記のものとは別に、ビットごとの演算子が必要になる場合があり、最良の選択は&です|。混乱を避ける必要がないためです。


なぜ物事を複雑にして 2 文字バージョンを使用するのですか?

于 2013-01-01T21:07:32.223 に答える
1

コンパイラは、引数だけを見て適切な演算子を推測できません。どちらを選択するかはビジネス上の決定です。それは怠惰な計算についてです。例えば

public boolean a() {
  doStuffA();
  return false;
}

public boolean b() {
  doStuffB();
  return true;
}

そして今: a() & b()実行されますが、実行さdoStuffB()a() && b()ません

于 2013-01-01T21:13:02.770 に答える