LINEスタンプ制作代行サービス・LINEスタンプの作り方!

お電話でのお問い合わせ:03-6869-8600

stampfactory大百科事典

短絡評価

短絡評価(たんらくひょうか、)または最小評価(さいしょうひょうか、)とは、多くのコンピュータプログラミング言語の論理演算子における左辺(第一引数)と右辺(第二引数)の式の評価法の評価法を(意味、意味論を)表す語である。「≪左辺≫ ≪論理演算子≫ ≪右辺≫」というような、論理演算子による式(論理演算子式)があるとする。左辺(第一引数)を評価した段階で式全体の値が定まらない場合のみ右辺(第二引数)を評価する、というのが短絡評価である。例えば、論理ANDの第一引数を評価した結果が codice_1 であれば、式全体は必ず codice_1 になるし、論理ORの第一引数が codice_3 であれば、式全体は必ず codice_3 になるので、第二引数を評価するまでもないので、そこで打切るのである。前述のように多くの言語の論理演算子は短絡評価だが、Pascalでは「処理系依存」である。Adaでは両方を評価する演算子と短絡評価の演算子とが用意されている。JavaやVBでは、短絡評価の論理演算子の他に、ビット演算の演算子のうちのandとorが、ブーリアン型にも多重定義された演算子()で、そちらは通常の評価法である。なお「C言語では短絡評価について標準では決められていない」という出処不明のデマがあるが、C89()の時代から短絡評価されることが明確に定義されているし、それ以前からK&Rの初版など、短絡評価されることが明確に書かれている。また、C++では codice_5 や codice_6 をオーバーロードでき、そうすると短絡評価ではなくなる。短絡評価の演算子には単なる演算子としての役割だけでなく、制御構造としての役割を負わせることができる。(なお、ALGOL 68 は "proceduring" という機能を使ってユーザー定義の短絡評価の演算子やプロシージャを実現できる)短絡評価では、codice_7 は、codice_8 というようなif式(if文ではない。一般に文は値を持たない)のような意味となり、codice_9 は、codice_10 のような意味となる。ただしこれは演算結果の値がcodice_3あるいはcodice_1のブーリアン型の場合である。 型付けが弱い言語などでは、論理演算子の引数として任意の型を使うことができ、型毎に定められている、その値が真っぽい(truthy)か、偽っぽい(falsey)か、に従って短絡評価の論理演算を行うものがある。この場合、「その式全体の真偽を決定付けた、最後に評価した引数の値」を返す。下の表の型のカラムではその値の型という意味で、「最後に評価した値」としている。例として次のC言語のコードを見てみよう。int a = 0;if (a && myfunc(b)) {この例では、短絡評価によって codice_13 は決して呼び出されない。なぜなら codice_14 は "false" と評価されるからである。この性質を利用して2種類のプログラミング技法が得られる。1つは、後半の部分式に時間のかかる処理を置き、最初の部分式でその処理が必要か否かのチェックをするようにすれば、無駄な関数呼び出しなどを減らすことができる。2つめとして、後半の部分式が実行時エラーを起こすかどうかのチェックを前半で行うというコーディングが考えられる。例えば、次のC言語コードは、短絡評価を利用してヌルポインタの参照を防いでいる。int is_three_chars_long(const char *p) {このような利点はあるが、短絡評価であることを忘れていると問題が発生することがある。例えば、次のコードを見てみよう。if (expressionA && myfunc(b)) {ここで myfunc(b) が常に実行されることを期待していると、expressionA が false だった場合に実行されないことになり、問題が発生する。Java などの言語では短絡評価式の演算子と普通の演算子を用意して、このような問題に対処している。if文の条件式で使われる論理積や論理和の演算子は、if文の入れ子をコンパクトに表したものと見ることもできる。例えば、次の擬似コードでは短絡評価が行われるとする。codice_15これは、論理積を展開することで次のようにも表せる。codice_16ブール論理の性質から、A_FALSE と B_FALSE というコード部分が、最初の例では FALSE という部分に集約されていることに注意されたい。後者の例の方が条件によって異なる処理を記述できるため、必要に応じて使い分けることになる。両者が結局同じことをするコードであれば、共通式削除や定数伝播といったコンパイラ最適化によって、どちらも同じコードを生成する可能性がある。短絡評価を使ってコードの一部の条件付実行を実現することもできる。以下は Perl の例である。some_condition or die; # some_condition が false なら実行を停止some_condition and die; # some_condition が true なら実行を停止1968 Final Report での仕様と 1973 Revised Report での仕様は異なる。本来の ALGOL 68 には "proceduring" という機能があった。これは、項の値をその項を評価するプロシージャに合わせるようにすることである。"proceduring" は実質的には評価を「遅延」させることができる。その最も便利な利用法として、論理演算の短絡評価がある。以下はユーザー定義演算子の例である。従って、1973 Revised Report 以前には、プログラマは演算子(やプロシージャ)の引数の評価を逐次的にするか並行的にするかを選択可能であった。ただし、これは予定通りには機能しなかった。多くの実装では andf/orf や andth/orel といった拡張を特別に扱って短絡評価をエミュレートしていた。

出典:wikipedia

LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。