JavaA2Z

KAB-studio > プログラミング > JavaA2Z > ショートサーキットとは

ショートサーキット

日本語 短絡回路
英語 short circuit
ふりがな しょーとさーきっと
フリガナ ショートサーキット

解説

左オペランドのみ評価し、右オペランド評価しないこと。
 
&&演算子||演算子は、左オペランドを先に評価する。
その際左オペランドが、&&演算子false||演算子trueの場合には、右オペランド評価しない。
つまり「右オペランド評価を省略する」ため、これを「ショートサーキット」「短絡評価」と言う。また&&演算子||演算子を「ショートサーキット演算子」「短絡演算子」とも言う。

&&演算子の場合、左オペランド評価した結果がfalseの場合に右オペランド評価しない。
これは、右オペランドの結果に関わらず結果はfalseとなり、右オペランド評価が「必要ない」ためである。
 
||演算子の場合、左オペランド評価した結果がtrueの場合に右オペランド評価しない。
これは、右オペランドの結果に関わらず結果はtrueとなり、右オペランド評価が「必要ない」ためである。
 
右オペランドで何らかの処理をっている場合、その処理そのものがわれない。
ショートサーキットを使用することでプログラムを簡略化することができる場合がある。
ただし、この2つの演算子がショートサーキットをうことを知らない場合、処理されるはずなのに処理されない、といったバグを生む可能性ががあるため注意すること。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        boolean b;
        // &&演算子はショートサーキットが行われます。
        b = false && getTrue();
        // (何も出力されません)

        // この時、getTrue()メソッドは呼ばれません。
        // &&演算子は左オペランドから評価します。そして、
        // 左オペランドがfalseの場合、右オペランドに関わらず
        // 結果はfalseとなるため、右オペランドは評価されません。
        // だからgetTrue()メソッドが呼ばれないわけです。

        // ||演算子はショートサーキットが行われます。
        b = true || getTrue();
        // (何も出力されません)

        // この時、getTrue()メソッドは呼ばれません。
        // ||演算子は左オペランドから評価します。そして、
        // 左オペランドがtrueの場合、右オペランドに関わらず
        // 結果はtrueとなるため、右オペランドは評価されません。
        // だからgetTrue()メソッドが呼ばれないわけです。

        // ショートサーキットの利用例のひとつに、nullチェックがあります。
        Boolean aBoolean = null;
        if( ( aBoolean != null ) && ( aBoolean.booleanValue() == true ) )
        {
            System.out.println( "aBooleanはtrueです。" );
        }
        // (何も出力されません)

        // 「( aBoolean != null )」がfalseとなるため、ショートサーキットが働き
        // 「( aBoolean.booleanValue() == true ) 」が評価されません。
        // そのため、もし「aBoolean.booleanValue()」を呼び出そうとしたら
        // NullPointerException例外が投げられますが、それを避けることが
        // できます。
        // nullチェックは行う回数が多いので、こういったテクニックがよく
        // 使われます。

        // ありがちなバグの例として以下のようなものがあります。
        boolean b2 = true;
        b = true || ( b2 = false );
        System.out.println( b2 );
        // true

        // 「( b2 = false )」が評価されていないため、b2にfalseが
        // 代入されていません。
        // こういったバグを生まないよう、&&演算子と||演算子では
        // 右オペランドの式に副作用がないか確認するくせをつけましょう。
    }

    /**
     * 呼ばれたかどうか確認するためのメソッド。
     * 「Sample#getTrue()」を出力し、必ずtrueを返します。
     */
    private static boolean getTrue()
    {
        System.out.println( "Sample#getTrue()" );
        return true;
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        boolean b;
        // &&演算子はショートサーキットが行われます。
        b = false && getTrue();
        // (何も出力されません)

        // この時、getTrue()メソッドは呼ばれません。
        // &&演算子は左オペランドから評価します。そして、
        // 左オペランドがfalseの場合、右オペランドに関わらず
        // 結果はfalseとなるため、右オペランドは評価されません。
        // だからgetTrue()メソッドが呼ばれないわけです。

        // ||演算子はショートサーキットが行われます。
        b = true || getTrue();
        // (何も出力されません)

        // この時、getTrue()メソッドは呼ばれません。
        // ||演算子は左オペランドから評価します。そして、
        // 左オペランドがtrueの場合、右オペランドに関わらず
        // 結果はtrueとなるため、右オペランドは評価されません。
        // だからgetTrue()メソッドが呼ばれないわけです。

        // ショートサーキットの利用例のひとつに、nullチェックがあります。
        Boolean aBoolean = null;
        if( ( aBoolean != null ) && ( aBoolean.booleanValue() == true ) )
        {
            System.out.println( "aBooleanはtrueです。" );
        }
        // (何も出力されません)

        // 「( aBoolean != null )」がfalseとなるため、ショートサーキットが働き
        // 「( aBoolean.booleanValue() == true ) 」が評価されません。
        // そのため、もし「aBoolean.booleanValue()」を呼び出そうとしたら
        // NullPointerException例外が投げられますが、それを避けることが
        // できます。
        // nullチェックは行う回数が多いので、こういったテクニックがよく
        // 使われます。

        // ありがちなバグの例として以下のようなものがあります。
        boolean b2 = true;
        b = true || ( b2 = false );
        System.out.println( b2 );
        // true

        // 「( b2 = false )」が評価されていないため、b2にfalseが
        // 代入されていません。
        // こういったバグを生まないよう、&&演算子と||演算子では
        // 右オペランドの式に副作用がないか確認するくせをつけましょう。
    }

    /**
     * 呼ばれたかどうか確認するためのメソッド。
     * 「Sample#getTrue()」を出力し、必ずtrueを返します。
     */
    private static boolean getTrue()
    {
        System.out.println( "Sample#getTrue()" );
        return true;
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2010/03/04
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。