三項演算子と自動性能比較や開梱問題

三項演算子の概要

フォーマット

(条件式)?式1:式2;

例えば

求3 <8(9 <6 7:5):?> 0 2 4:1

5を与えるために、式(3)に<85:ブラケット最優先なので、括弧内の最初のカウント(5 9 <67):2> 04:1;?

?条件演算子、右結合条件を有する演算子であり、そして右から左へパケットを算出し、我々は最初の2> 04計算:<式3に、4を与えるために85 1:4;?

5最終的に得られた結果。

自動的に開梱三項演算子の問題

オリジナルリンク:https://www.cnblogs.com/wadmwz/p/8963895.html

課題レビュー

パブリック 静的 ボイドメイン(文字列[]引数){ 
    地図 <文字列、ブール>マップ= 新しい HashMapの<> (); 
    ブールB =マップ!= nullのmap.get( "テスト"):; 
    System.out.println(B)。
}

 

一般的に、我々は、ブールB上記の結果のコードの値がnullであるべきだと思います。map.get(「試験」)の値がnullであり、Bが対象であるので、その結果はヌルになり得ます。

しかし、上記のコードは、NullPointerExceptionがスローされます

まず明らかなのは、NULLポインタを報告するので、それがnullのオブジェクトのメソッドのいくつかを呼び出すために、いくつかの場所でなければならないということです。唯一のメソッド呼び出しを探しますこのコードの短い二行ではmap.get("test")、私たちも認識しており、マップが以前に初期化されており、NULLにすることはないであろう、そして、最後にそれがどこNULLポインタです。

私たちは、その後、逆コンパイルコードについて。コンパイラプロセスがどのようになった後、我々が記述したコードを見てください。次のように逆コンパイルコードの後に次のとおりです。

パブリック 静的 ボイドメイン(文字列引数[]){ 
   地図の地図 = 新規HashMapの()。
   ブールB = Boolean.valueOf(マップ== nullの:((ブール)map.get( "テスト" 。))にbooleanValue()); 
   System.out.println(B)。
}

 

デコンパイル後にこのコードを読んだ後、分析した後、我々は、おそらくどこに問題を知っています。

((ブール)hashmap.get(「試験」))にbooleanValue()プロシージャ実行および結果は以下の通りであるれます。

hashmap.get( "テスト") - >ヌル。

(ブール値)nullで>はnull;

null.booleanValue() - >エラー

さて、問題はに標的にされました。明らかに、上記ソースコードmap.get(「試験」)としてコンパイル中

(ブール)map.get( "試験")するBooleanValue()、自動アンパック動作です。

なぜ、それから、これは解凍自動的に起こるのだろうか?そして、問題はそれを解決する方法ですか?

第四に、原則として分析

それは結論付けることができます:NullPointerExceptionが上の理由は、三項演算することと、自動的につながったnullポインタ例外を開梱する必要があります。

だから、なぜ、このコードは自動的にそれを解凍しますか?これは実際の三項演算子の構文仕様です。

単にそれを意味する:第二及び第三のオペランドが基本タイプとオブジェクトである場合、オブジェクトは、実質的に動作タイプをアンパックしますことを特徴とします。

三項演算子の使用、第2および第3オペランドは基本タイプとオブジェクトである。したがって、その結果です。オブジェクトがnullであるとして、オブジェクトが、操作を開梱されたときに、そのNPEの報告にnull.booleanValueアンパックプロセスを()を呼び出します。

 

第五に、問題が解決され、

コードがそのように書かれている場合、エラーはしません。

地図<文字列、ブール>マップ=   新しい HashMapの<文字列、ブール> (); 
ブールB =(!マップ= nullの?map.get( "テスト"):Boolean.FALSE);

これは、上記のコードの結果は、bがnullで得自動的にアンパック動作が発生していない第三項演算子三オペランド・オブジェクト・タイプ、ことを保証することです。

 

三項演算子とIF ... ELSE性能比較

オリジナルリンク:https://blog.csdn.net/prestonzzh/article/details/52538541

1.概要

さもなければ、もしより性能...良好な性能; X = Y> 0 A:?Bとの三項演算子

2.原理

2.1 CPU処理モード

CPUの性能は、パイプライン処理することによって得られます。CPUは、単に現在の指示に対処しているとき、いわゆるラインは、N個の命令が実行されるのを待って、待ち行列の後ろになっています。このように、次の命令を実行する際に、その命令のために見ていない、それは前の命令が実行待ちに関係しています。

2.2 ...他にあれば...処理モード

プログラマが注文するためのCPU命令のためのシンプルなパイプライン化された書き込みコードがある場合、それは簡単です。しかし...それ以外の場合は...同じではありません。

...他にあれば...それは単にこれです:私は条件を満たしたとき、私はAを実行します、私の条件が満たされない場合、私はBを実行します それは、このステップのための条件を決定するために実行しなかった。しかし、コマンドラインへのCPUのために、あなたはそれが完全なを満たしていないかわかりません!それは命令キューまで良くないようにします。

あなたはそれがあなたの後ろの行の命令、条件を満たし従うと仮定します。あなたが最終的に条件の実装は満足していない、あなたは空のキューの前に良いの行を配置する必要が見つかったときに、あなたはあなたに戻ってB命令の実行を与えるために再ルーティングされます。罰CPUの処理時間が長くなるには、この予測誤差が発生します。

突起が正確であると仮定すると、各関数呼び出し約13クロックサイクル、及び限り予測誤差としては、それは約44クロック・サイクルを必要とすることができます。

2.3三オペレータ処理モード

三項演算子の場合は、そのアプローチが異なっています。

X = Y> 0 A:B;?

CPUは、この命令キューを与える場合には、結果を計算し、二つの結果が、すなわち、式A及びBは、式のCPUに処理され、キューに入れられるであろう。

CPUの計算が、それはより多くの何かのようである、あなたはそれが全体的な速度ですが速いために並んで、実行するモードをパイプライン化することが可能に並ぶことができます。

CPUのAとBは、(異なるいると...他に...、唯一の結果をカウントする場合)、そして最後のy> 0を決める計算された2つの結果を与えるのだろうか?。Y> 0の場合、A、Bの破棄を選択し、そうでない場合、選択B、Aを捨て

3.ディスカッション

それはちょうど非常に非常に詳細な内容は、通常の使用には大きな違いを感じるべきではない何か。そして、三項演算子の範囲は、実際に使用されても非常に限られている、それはいくつかの複雑な場合、コード記述された人々が読んでいない、それは無意味になり、いくつかの簡単なポイントを使用することができますを選択します。

おすすめ

転載: www.cnblogs.com/createtable/p/11206397.html