スポンサーリンク
※サイト運営にサーバーは必須です※
 ~ ロリポップ! 
はコスパのよい初心者向けサーバーです~
   
![]()
目次
論理演算子とは?
論理演算子とは、真偽(論理)値を扱う演算子です。
論理演算子の判定結果は、true(真)かfalse(偽)を返します。
論理演算子には以下のような種類があります。
| 演算子 | 項数 | 意味 | 
| ! | 1 | 否定(NOT) | 
| & | 2 | かつ(AND) | 
| && | 2 | かつ(AND) | 
| | | 2 | または(OR) | 
| || | 2 | または(OR) | 
| ^ | 2 | 排他的論理和(XOR) | 
NOT(否定演算子「!」)
Aがtrueなら!Aはfalseを返します。
| A | !A | 
| true | false | 
| false | true | 
AND(「&」「&&」)
難しい言葉で言えば、2つの式の論理積(AND)を求めます。
両方の式がtrueであれば、trueを返します。
そうでない場合は、falseを返します。
| A | B | A&B | 
| true | true | true | 
| true | false | false | 
| false | true | false | 
| false | false | false | 
※上のパターンで言えば、AとBの両方がtrueでないと、「A&B」はtrueにならない。
OR(「|」「||」)
難しい言葉で言えば、2つの式の論理和(OR)を求めます。
両方の式のどちらかがtrueであれば、trueを返します。
両方ともfalseの場合に、falseを返します。
| A | B | A|B | 
| true | true | true | 
| true | false | true | 
| false | true | true | 
| false | false | false | 
※上のパターンで言えば、AとBのどちらかがtrueであれば、「A|B」はtrueになります。
XOR(「^」)
難しい言葉で言えば、2つの式の排他的論理和(XOR)を求めます。
2つの式が同じであれば、falseを返し、2つの式が異なれば、trueを返します。
| A | B | A^B | 
| true | true | false | 
| true | false | true | 
| false | true | true | 
| false | false | false | 
演算子の優先順位
演算子の優先順位は
「!」(NOT)>「&」(AND)>「^」(XOR)>「|」(OR)
左側の演算子が優先されます。
最低限、ANDはORより優先されると覚えておきましょう。
※単項演算子と2項演算子を比較すると、単項演算子が優先されています。また、二項演算子同士を比べた際、trueを返すパターンが少ない演算子の方が、先に演算されると覚えておきましょう。ANDは1パターン、XORは2パターン、ORは3パターン、trueを返すパターンがあります。
以下が演算子の優先順位を比較する用のソースコード。
言語はC#
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103  | 
						using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace operator10 {     class Program     {         static void Main(string[] args)         {             bool t = true;             bool f = false;             bool a = !f & f;             bool a1 = (!f) & f;//こっちが正しい             bool a2 = !(f & f);             Console.WriteLine("!f & f");             Console.WriteLine(a);             Console.WriteLine(a1);             Console.WriteLine(a2);             bool aa = f & (!f);//順序に関係ないか確認             Console.WriteLine(aa);             Console.WriteLine();//改行             bool b = f & f | t;             bool b1 = (f & f) | t;//こっちが正しい             bool b2 = f & (f | t);             Console.WriteLine("f & f | t");             Console.WriteLine(b);             Console.WriteLine(b1);             Console.WriteLine(b2);             Console.WriteLine();//改行             // 順序に関係ないか確認             bool bb = t | f & f;             bool bb1 = t | (f & f);//こっちが正しい             bool bb2 = (t | f) & f;             Console.WriteLine(" t | f & f");             Console.WriteLine(bb);             Console.WriteLine(bb1);             Console.WriteLine(bb2);             Console.WriteLine();//改行             //うまくいかないパターンを探索(8通り)             bool[] d = new[] { f, f, f, f, t, t, t, t };             bool[] d0 = new[] { f, f, t, t, f, f, t, t };             bool[] d1 = new[] { f, t, f, t, f, t, f, t };             for (int i = 0; i < 8; i++)             {                 bool c = d[i] | d0[i] ^ d1[i];                 bool c1 = (d[i] | d0[i]) ^ d1[i];                 bool c2 = d[i] | (d0[i] ^ d1[i]);                 Console.WriteLine("" + c + c1 + c2);             }             Console.WriteLine();//改行             //発見したパターンを取り出す             bool e = t | t ^ t;             bool e1 = t | (t ^ t);//こっちが正しい             bool e2 = (t | t) ^ t;             Console.WriteLine("  t | t ^ t");             Console.WriteLine(e);             Console.WriteLine(e1);             Console.WriteLine(e2);             bool ee = t ^ t | t;             Console.WriteLine(ee);//順序に関係ないか確認             Console.WriteLine();//改行             //うまくいかないパターンを探索             for (int i = 0; i < 8; i++)             {                 bool c = d[i] & d0[i] ^ d1[i];                 bool c1 = (d[i] & d0[i]) ^ d1[i];                 bool c2 = d[i] & (d0[i] ^ d1[i]);                 Console.WriteLine("" + c + c1 + c2);             }             Console.WriteLine();//改行             bool g = f & t ^ t;             bool g1 = (f & t) ^ t;//こっちが正しい             bool g2 = f & (t ^ t);             Console.WriteLine(" f & t ^ t");             Console.WriteLine(g);             Console.WriteLine(g1);             Console.WriteLine(g2);             bool gg = t ^ t & f;             Console.WriteLine(gg);//順序に関係ないか確認         }     } }  | 
					
実行結果
!f & f
 False
 False
 True
 False
 f & f | t
 True
 True
 False
 t | f & f
 True
 True
 False
 FalseFalseFalse
 TrueTrueTrue
 TrueTrueTrue
 FalseFalseFalse
 TrueTrueTrue
 TrueFalseTrue
 TrueTrueTrue
 t | t ^ t
 True
 True
 False
 True
 FalseFalseFalse
 TrueTrueFalse
 FalseFalseFalse
 TrueTrueFalse
 FalseFalseFalse
 TrueTrueTrue
 TrueTrueTrue
 FalseFalseFalse
 f & t ^ t
 True
 True
 False
 True
関連記事
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。
