LoginSignup
3

More than 5 years have passed since last update.

SAN値論理

Posted at

はじめに?

タイトル落ちです。
偶然タイトルを思いついてしまったので、勢いで記事にしてしまいました。

bool?型の論理演算ってどうなるの?

C#でbool?型への論理演算はどうなるのかを試してみましょう。

  • !A (NOT)
  • A&B (AND)
  • A|B (OR)
  • A^B (XOR)

試す論理演算は上記の通りです。
言語仕様に含意が無いのが残念(わがまま)

コード?

ネタ記事ですが、コードくらいは載せましょう……

試したコード
class SanValueBoolean {
    public void Do() {
        var bools = new bool?[] { true, false, null };
        foreach (var b in bools) {
            LogicalNot(b);
        }
        var pairs = from b1 in bools from b2 in bools select (b1, b2);
        foreach (var (b1, b2) in pairs) {
            LogicalOperation(b1, b2);
        }
    }

    /// <summary>AND,OR,XOR</summary>
    void LogicalOperation(bool? left, bool? right) {
        Console.WriteLine($"{left.ToDisp()}\t& {right.ToDisp()}\t= {(left & right).ToDisp()}");
        Console.WriteLine($"{left.ToDisp()}\t| {right.ToDisp()}\t= {(left | right).ToDisp()}");
        Console.WriteLine($"{left.ToDisp()}\t^ {right.ToDisp()}\t= {(left ^ right).ToDisp()}");
    }

    /// <summary>NOT</summary>
    void LogicalNot(bool? value) {
        Console.WriteLine($"!{(value).ToDisp()}\t= {(!value).ToDisp()}");
    }
}

/// <summary>表示の補助</summary>
static class NullableExt {
    public static string ToDisp(this bool? b) => b?.ToString() ?? "NULL";
}

結果?

結果は以下のとおり。

!True   = False
!False  = True
!NULL   = NULL
True    & True  = True
True    | True  = True
True    ^ True  = False
True    & False = False
True    | False = True
True    ^ False = True
True    & NULL  = NULL
True    | NULL  = True
True    ^ NULL  = NULL
False   & True  = False
False   | True  = True
False   ^ True  = True
False   & False = False
False   | False = False
False   ^ False = False
False   & NULL  = False
False   | NULL  = NULL
False   ^ NULL  = NULL
NULL    & True  = NULL
NULL    | True  = True
NULL    ^ True  = NULL
NULL    & False = False
NULL    | False = NULL
NULL    ^ False = NULL
NULL    & NULL  = NULL
NULL    | NULL  = NULL
NULL    ^ NULL  = NULL

まとめ?

以下の定義を与えるとクリーネの3値論理になります。
SQLの論理型と同じような感じですね。

含意(A⇒B)
bool? IMP(bool? left, bool? right) => !left | right;

この記事を読んで何か得るものがあるとすれば、以下の事実でしょう。nullが絡むすべての演算がの結果nullになるわけではないということです。

False & NULL = False
True  | NULL = True

以上、出オチ記事を最後まで読んでいただきありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3