【プログラミング】短絡評価【論理演算子】
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【プログラミング】短絡評価【論理演算子】

2018-07-13 23:29

    短絡評価(英:Short-circuit evaluation)とは

    ・論理演算は左から順に評価されます。
    ・AND論理演算の場合、左辺と右辺の双方が真の場合にが成立します。
    ・左辺と右辺のどちらか、あるいは双方が偽の場合はが成立します。
    ・左から順に評価されるため、まず左辺が評価されます。
    ・左辺が偽の場合、右辺を評価するまでもなくその論理演算はであることが確定します。
    ・なので右辺は評価しないというのが短絡評価である。
    ・短絡演算、サーキット評価、サーキット演算とも呼ばれている。

    ほとんどのプログラミング言語は処理速度を優先して短絡評価されていますが、そうじゃないものも少なからずあります。
    例えばVisual Basicの入門向け参考書などでは、AND論理演算はAnd演算子、OR論理演算はOr演算子を使うように紹介されていると思います。
    しかしそれらは、短絡評価ではないのです。すべて評価を行ってから真偽を決めています。
    そのため、左辺の処理によっては右辺の処理がNull参照してしまうようなコードの場合、NullReferenceExceptionが起こります。
    Visual Basic .NETの場合、AndAlso演算子、OrElse演算子を用いることで短絡評価することができます。

    短絡評価の特性を生かすことによって、コードをシンプルにすることができる場合があります。
    以下の例は、Windows APIを用いてサービスの状態を取得するC++のコードです。

    もしもC++が短絡評価じゃなかったら、afterのコードの場合hManagerがNULLでも次の評価がされて、OpenServiceの第1引数にNULLが代入されているhManagerを渡すと、エラーが起きて確実にOpenServiceはNULLを返し、さらにその次のQueryServiceStatusの第1引数にNULLが代入されているhServiceを渡すと、これまたエラーが起きてQueryServiceStatusは確実にNULLを返します。
    Windows APIを使用した際に、GetLastErrorを呼び出すとエラーコードを取得できますが、こうなってしまうとQueryServiceStatusのエラーコードを取得することになってしまい、OpenSCManagerがなぜNULLを返してきたのかを特定するのが困難になるでしょう。

    IF構文が読みづらくて悪いと感じるか、error = GetLastError();が1か所で済む、下の方のerror = GetLastError();が何の条件が偽だったらなのかいちいち確認するために上の方に視線を向ける必要が無くなって良いと感じるかはあなた次第。
    個人的にはIFが分散していると可読性が悪くなると感じるので、活用できる場面では積極的に活用していきたいところですね。
    もっとも、結局間に処理が欲しくなって分解せざるを得なくなって、そして書き直す過程でコーディングミスをしてしまうなんてことも…?短絡評価の活用は計画的に。


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。