この章のテーマ §
&&演算子と||演算子を学びます。これを使うと条件判断が高速化しますが、罠もあります。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, メソッドの基礎, bool型
解説 §
&&演算子と||演算子は条件判断を高速化することができる機能です。
&&演算子は左右の式はどちらもTrueなら結果がTrueになります。(AND)
||演算子は左右の式はどちらかがTrueなら結果がTrueになります。(OR)
ただし、左の式を計算した時点で右の式の値に関係なく結果が決まるときは右の式を計算しません。その結果、速度は高速化します。しかし、何か実行して欲しい処理がある場合はそれが実行されないことになり、意図しない結果を出す場合があります。
サンプルソースを見ると、A2とD2は実行されていません。これは、A1とD1の処理を行った時点で結果が決まってしまうからです。
罠の数々 §
- ビット演算を行う&演算子と|演算子と見た目が似ているが、機能が異なるので注意しよう
- 計算式の中で目的の計算以外の処理を実行させることがある。こういう使い方をしているとき、この2つの演算子は要注意である
参考リンク §
ブール論理演算子 (C# リファレンス)
サンプルソース: conditionalLogical §
Console.WriteLine("Case A");
if (test(false, "A1") && test(true, "A2")) Console.WriteLine("True"); else Console.WriteLine("False");
Console.WriteLine("Case B");
if (test(true, "B1") && test(true, "B2")) Console.WriteLine("True"); else Console.WriteLine("False");
Console.WriteLine("Case C");
if (test(false, "C1") || test(true, "C2")) Console.WriteLine("True"); else Console.WriteLine("False");
Console.WriteLine("Case D");
if (test(true, "D1") || test(true, "D2")) Console.WriteLine("True"); else Console.WriteLine("False");
bool test(bool x, string label)
{
Console.WriteLine($"{label}が実行されました。");
return x;
}
実行結果 §
Case A
A1が実行されました。
False
Case B
B1が実行されました。
B2が実行されました。
True
Case C
C1が実行されました。
C2が実行されました。
True
Case D
D1が実行されました。
True
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
こういう機能はなぜAND(両方が真)とOR(どちらかが真)にしか存在しないのだろうか。なぜ足し算や引き算には存在しないのだろうか。理由を考えてみよう。
- C#の設計者がうっかり追加するのを忘れたから
- 便利すぎる機能は人を堕落させるから
- マシンの性能が上がった結果、高速化を意識する必要がなくなったから
- 右の式も左の式も計算しないと結果が決まらない場合は全ての計算を飛ばせないから
- アメリカ大統領が命令したから
[[解答]]