2016-07-13 16 views
6

我々は
は、Javaの「+」演算子は、両方の算術演算と文字列連結の間にJavaの '+'演算子がありますか?

  • 算術演算のために使用されている
  • 文字列の連結を追加します知っているよう

私は両方を一緒
を使用する場合、正確に期待される行動を知っているし、ルールを適用する必要があります 私はjavaコードを試してみるとき

System.out.println("3" + 3 + 3); // print 333 String concatenation ONLY 
System.out.println(3 + "3" + 3); // print 333 String concatenation OLNY 
System.out.println(3 + 3 + "3"); // print 63  Arithmetic Add & String concatenation 
+3

オペランドは左から右に評価されます。予想される動作は、このプログラムを実行するときに見た動作です。 – Spotted

+0

'System.out.println(" 3 "+(3 + 3));'のように、文字列を置いた後に数値を追加することもできます。数字を分離すると、数字だけを出力するのではなく、実際に数値を計算します。 – NemanjaT

答えて

10

これは、基本的な演算子の優先度で、連結と数値加算の組み合わせがStringです。

引用:

1つのみの場合オペランド式はString型で、文字列 変換(§5.1.11)は、実行時に 文字列を生成するために他のオペランドに対して行われます。

文字列連結の結果は、2つのオペランド文字列の連結である文字列オブジェクト への参照です。左オペランドの の文字は、新しく作成された文字列の右側の オペランドの文字に先行します。

式が 定数式(15.28)でない限り、Stringオブジェクトが新しく作成されます(§12.5)。

の変換と連結を1つの手順で実行して、中間の 文字列オブジェクトを作成してから廃棄することを避けることができます。繰り返しストリング 連結のパフォーマンスを向上させるために、Javaコンパイラは、式の評価によって作成された中間文字列オブジェクト の数を減らすためにStringBufferクラス又は 同様の技術を使用してもよいです。

プリミティブ型の場合、プリミティブ型 から文字列に直接変換することで、実装でラッパーオブジェクトの作成を最適化することもできます。

言語仕様hereを参照してください。

TL、両方のオペランドがある場合はバイナリ操作で任意のオペランドがString場合+ためDR

  • 演算子の優先順位から右
  • に任され、結果はString
  • あります結果は数値です
3

の評価の優先順位

  1. System.out.println("3" + 3 + 3);
    あなたはこれをしようとすると、最初のパラメータはStringであることから、すべての残りの部分は、文字列の連結

  2. System.out.println(3 + "3" + 3);

    になります:は、左から右へと、これはそれがどのように動作するかであるからです

    最初にint 3を追加できないため、String 3に最後に3を追加することができません。3

  3. System.out.println(3 + 3 + "3");

    右発現に

    第1の左が評価される(与え3 + 3 = 6)と、文字列3が出力として63を与え、その評価結果に添付されている

3

このISN」文字列連結そのものとは関係ありません。それはStringへの暗黙のキャストに関するものです。そして、上記の場合、暗黙のかっこなしで、左から右に動作します。そして、Stringはintよりも優先されます。ここで

例1

System.out.println("3" + 3 + 3); 

は、それが文字列で始まるので、それ以降の各オペレーションは、暗黙的に+演算子を行う前に、文字列にキャストされます。したがって、 "333"。文字列この場合、最初の3

例3

System.out.println(3 + 3 + "3"); 

上に、第一優先として

System.out.println(3 + "3" + 3); 

同じ例は、ここで適用されます2つの数字がint型で追加され、結果は6になりますが、次にString型に追加されると、それは連結を仮定し、したがって "63"となる。

として、specification

関連する問題