2017-06-18 19 views
4

私は、チュートリアルでは、hereとラインでの提供続いている:T1のJavaの三項式はどのように評価されますか?

boolean t1 = false?false:true?false:true?false:true; 

最終的な値はfalseです。私はそれを真と評価した。 最初のfalseはtrueを返し、trueがfalseを返し、さらに最後にtrueを返します 私は正しいですか?いいえ、私は間違っています。 Javaでの三項式の評価方法を教えてください。

+2

あなたのコードは 'boolean t1 =!false &&(true?false:true?false:true);'常に 'false'に単純化できます。 –

+0

括弧/かっこを使用して、この1つであなたの人生を楽にしてください。 – Shark

答えて

5

コンパイラが?文字を見つけたら、対応する:を探します。 ?の前の式は、条件を表す三項条件演算子の最初のオペランドです。

?:の間の式は、条件が真である場合に値が返される演算子の第2オペランドです。

:の後の式は、条件がfalseの場合に値が返される演算子の3番目のオペランドです。

boolean t1 = false ? false : true?false:true?false:true; 

      first  second  third 
      operand operand  operand 

最初のオペランドがfalseであるので、結果はそうのは、それを評価させ、第三オペランドtrue?false:true?false:trueの値である:

true ? false : true?false:true; 

first  second  third 
operand  operand operand 

最初のオペランドが真であるので、結果が第二の値であり、オペランド - false

ところで、第三のオペランドtrue?false:trueの値もfalseので、関係なくxの値の偽x?false:true?false:true戻ります。

+0

申し訳ありませんが、どのようにオペランドが区切られているか教えてください。すなわち第1の第2および第3のオペランドは実際には何かである。私はJava言語の初心者です。 –

+0

@BibekGhimire私は答えを編集しました。 – Eran

4

これらの操作は、結合規則に従って再編成できます。

boolean t1 = (false ? false : (true ? false : (true ? false : true))); 
        |      |    | 
        |      |    1 
        |      2 
        3 

は理論的には、これが最初に評価された経験1

  1. が起こる必要があり、falseとして評価されているものです。
  2. Exp 2は現在:true? false : falseです。したがって、最終出力はfalseです。
  3. Exp 3は今度はfalse ? false : falseになります。これはfalseです。今

、技術的な取得するには、これは実際には何が起こるかです:

  1. 経験3 false ? (don't care) : (...)ある - 経験2と評価される経験1の必要性を含む>内部表現。
  2. Exp 2はtrue: false, (don't care)です。すでにExp 2の値を決定しているので、Exp 1を評価する必要はありません。
  3. Exp 3がfalse ? (don't care) : falseに再評価されました。したがって、最終回答はfalseです。
+0

実際、あなたが「経験1」で示したことは決して評価されません。それはデッドコードです。 – Eran

+0

@Eran私は初心者のための技術的なものを手に入れようとしていませんでした。しかし、私は言及することが重要だと思います。更新しました。 –

1

以下の擬似コードは、式が評価される方法を示しています。それを見て

boolean t1 = false?false:true?false:true?false:true    
      = true && (true ? false : true ? false : true) 
      = true && false 
      = false 

別の方法:その後、

boolean t1 = !false && (true ? false : true ? false : true); 

boolean t1 = false?false:true?false:true?false:true; 

はに簡素化することができます簡略化:

;最終的 falseもたらす

boolean t1 = true && false; 

:その後に単純化

boolean t1 = true && (true ? false : true ? false : true); 

関連する問題