C#の条件AND(&&)OR(||)の優先順位
-
20-09-2019 - |
質問
我々は、すべての-時、私の仕事で、不必要なコーディングの引数に入ります。今日、私は尋ねた条件AND(&&)またはOR(||)持っていた優先順位が高い場合。私の同僚の一つは、彼らが同じ優先順位を持っていたと主張し、私は疑問を持っていたので、私はそれを見上げました。
MSDNによるAND(&&)高い優先順位よりもOR(||)を持っています。しかし、あなたが懐疑的な同僚にそれを証明することができますか?
http://msdn.microsoft.com/en -us /ライブラリ/ aa691323(VS.71).aspxのの
bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as
bool result = false || (true && false); // --> false
だから私の質問は、あなたがコードでそれを証明しない方法であるAND(&&)はOR(||)優先順位が高いですか?あなたの答えは、それは問題ではない場合には、なぜそれが言語でそのように構築されているのですか?
解決
真で最初に偽を変更します。私は(真|| true)を持っている愚かなようだ知っているが、それはあなたのポイントを証明します。
bool result = true || true && false; // --> true
result = (true || true) && false; // --> false
result = true || (true && false); // --> true
他のヒント
あなたが本当に試して、彼をフリークアウトしたい場合:
bool result = True() | False() && False();
Console.WriteLine("-----");
Console.WriteLine(result);
static bool True()
{
Console.WriteLine(true);
return true;
}
static bool False()
{
Console.WriteLine(false);
return false;
}
このは印刷されます:
True
False
False
-----
False
編集:
コメントに対応してます:
C#では、|
は||
同じブール論理を実行する論理演算子であるが、短絡しません。また、C#で、|
オペレータは||
と&&
両方よりも高い優先順位を有しています。
の値をプリントアウトすることで、あなたは私は典型的な||
演算子を使用した場合、最初True
が印刷されることを見ることができます - 。またTrue
だっただろう式の結果に続いて
しかしため|
の高い優先順位の、true | false
は(true
をもたらす)と最初に評価され、次にはその結果が&&
を得false
とfalse
edされます。
私は評価の順序、それが正常にできないだろうというとき|
の右半分は期間を評価したという事実だけを表示しようとしていませんでした。)
これはあなたが後にしている何を得ないでしょうか?それとも私が何かが欠けています...
bool result = true || false && false;
あなたはコードではなく、ロジックでそれを証明していません。 ORはブール加えているのに対し、ブール乗算です。今、どちらが優先順位が高い?
偽||真&&真
利回り:真
偽&&真||真
利回り:真
あなたは自分のブール式が短絡されている最終的な結果を表示することはできません。ここにあなたのケースを決済抜粋です。
|これは、実装&とに依存しています MSDN 7.11で述べたように&&と||で使用される演算子、条件論理演算子する
public static void Test()
{
B t = new B(true);
B f = new B(false);
B result = f || t && f;
Console.WriteLine("-----");
Console.WriteLine(result);
}
public class B {
bool val;
public B(bool val) { this.val = val; }
public static bool operator true(B b) { return b.val; }
public static bool operator false(B b) { return !b.val; }
public static B operator &(B lhs, B rhs) {
Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
return new B(lhs.val & rhs.val);
}
public static B operator |(B lhs, B rhs) {
Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
return new B(lhs.val | rhs.val);
}
public override string ToString() {
return val.ToString();
}
}
出力は&&は||前に最初に評価されていることを示す必要があります。
True & False
False | False
-----
False
余分な楽しみのために、結果= Tでそれを試してみてください|| T && Fと短絡して何が起こるかを見ます。