C++ ショートサーキット 書いて覚えるための初心者自己中記事
条件式の真偽判定は必ず最後まで行われるというわけでは無い。
if (1 == 2 && 3 == 4) { ... };
この条件部分では最初の
第一条件 1 == 2 は false
で、次の
&& <- この時点でもはや true にはならないと分かる。
3 == 4 <- ここを見るまでもない
結果 false
この判断を人間だけでなくC/C++ もやっているらしい。
さすがですね。
ショートサーキット
というらしいです。
しかし、このさすがな機能にもうっかりすると落とし穴があって
条件式に関数を入れておいて、真偽にかかわらずその関数は呼び出したい。
という場合に、関数を呼び出す前にショートサーキットしてしまう可能性があるということ。(ショートサーキットの言い方おかしいかもしれない)
戻り値の型が bool 型の関数を二つ使って && で条件式に入れたらそういう状況になりますね。
ショートサーキットを利用してそう言った条件にするなら問題ないですけど。
bool Input(double& n) { cout << "数値入力 : " << endl; n = 0; cin >> n; return n != 0; } int main() { double a, b; while (Input(a) && Input(b)) { cout << a << " / " << b << " = " << a / b << endl; cout << b << " / " << a << " = " << b / a << endl; } system("pause"); }
ショートサーキットを利用した良い例。
除算を行うための数値を二回入力する内容。
片方でも 0 が入力されてしまうと除算できないので、
最初の条件のIput でfalse になった段階でショートサーキットでfalse 判定されて終わる。
もう1つ例がある。
おっと、混乱しそう、
void Show(string* str) { if (! (str == NULL || str->empty())) { cout << *str << endl; } } int main() { Show(NULL); string str; Show(&str); str = "Hoge"; Show(&str); system("pause"); }
if (! (str == NULL || str->empty()))
これな。
NULL または empty だったら true
の逆。
ということは・・?
あー。いや、これ逆にしたのは true の時にcout したかっただけなのか。
単純に NULL でtrue だったらショートサーキットさせたいという話なのか。
なんだよ。はりきったのに。
ここまで。