0

次のようなブール状態に応じて出力を作成する必要がありました

  String smily = null;
  StringBuffer buff = new StringBuffer();
  buff.append(", " + smily == null ? ":)" : ":("); //$NON-NLS-1$

  System.out.println(buff.toString());

問題は文字列作成ステートメントです

  ", " + smily == null ? ":)" : ":("

私は2つの異なるEclipse環境でテストしました(また、2つの異なるJavaバージョンである可能性もありますが、これはチェックしていません)、結果は異なりました。

結果 1:

:(

結果 2:

間違い:(

もちろん、ブラケットを追加した場合は機能します

 buff.append(", " + (smily == null ? ":)" : ":(")); //$NON-NLS-1$

期待される結果:

、:)

なぜJavaがステートメントをそのように解釈するのか、誰かが私に説明してもらえますか?

ありがとう

4

5 に答える 5

4

演算子の優先順位を確認すると (このチュートリアルを参照)、加算 ( +) が等号 ( ==) の前にあることがわかります。つまり、Java は等価性を評価する前に", " + smily=>を最初に評価するため、 は false と評価され、三項演算子は と評価されます。", null"", " + smily == null":("

ところで:文字列を追加する前に文字列を連結しないことで、これを回避できた可能性がありますStringBuffer(StringBufferの要点は、連結を安価にすることです):

String smily = null;
StringBuffer buff = new StringBuffer();
buff.append(", ");
buff.append(smily == null ? ":)" : ":(");
于 2012-12-12T09:12:56.220 に答える
3

", " + smily == null ? ":)" : ":("は次のように評価されます(", " + smily) == null ? ":)" : ":("

これで結果 1 が説明できます。正直なところ、なぜ結果 2 が可能だったのかわかりません。

于 2012-12-12T08:54:22.337 に答える
1

StringBuffer.append()パラメータを取りStringます。したがって、これを角かっこなしで配置すると

buff.append(", " + smily == null ? ":)" : ":(")

評価時はになります", " + null。したがって、評価が行われるとき、それは常に偽です。

同じコードが2つの結果を返した理由については、2つの異なるJavaバージョンが使用され、この状況を異なる方法で処理したと推測できます。

于 2012-12-12T08:59:44.810 に答える
0

これを試して.....................

buff.append(", " + smily == null ? ":)" : ":(");

-上記のステートメントでは、適切な方法で評価する必要があることについて言及していません。smily == null ? ":)" : ":("

-これを解決するには、 BODMASルールを使用する必要があります。以下は、常に左から右にリストされている方法で評価されます。

Bracket

Power

Division and Multiplication

Addition and Substraction

-ブラケットを使用して囲みますsmily == null ? ":)" : ":("

例えば:

public class Test {

    public static void main(String[] args){

        String smily = null;
          StringBuffer buff = new StringBuffer();
          buff.append(", " + (smily == null ? ":)" : ":(")); //$NON-NLS-1$

          System.out.println(buff.toString());
    }

}

出力: , :)

于 2012-12-12T09:26:15.583 に答える
0
String smily = null;
StringBuffer buff = new StringBuffer();

  if(smily == null){
    buff.append(", " +  ":)") ; //$NON-NLS-1$
     }else{
        buff.append(", " +   ":(") ; //$NON-NLS-1$

}
于 2012-12-12T08:58:18.310 に答える