読者です 読者をやめる 読者になる 読者になる

Javaの+演算子

Javaというか,Processingで書いているので,本来ならSystem.out.print()/System.out.println()であるところをprint()/println()としていますが,変わらないと思います.

2015/06/14 追記: print()/println()内の型順序を変えたものを追加.全項目に追記.

print()/println()で+演算子を使用する場合,数値だけならば加算になるが,文字列を含むと連結になります. Stringが出現するまでは加算,出現したらそれ以降は連結に切り替わります.
また,()演算子内では個別に加算/連結 が決定されます.

 

スケッチ

boolean flag;

void setup(){
  flag = true;
}

void draw(){
  if( flag ){
    print("1 + 1 = "); println( 1 + 1 );
    print("1 + 1.1 = "); println( 1 + 1.1 );
    print("\"1: \" + 1 = "); println("1: " + 1 );
    print("\"1: \" + 1.1 = "); println("1: " + 1.1 );
    print("\"1: \" + 1 + 1.1 = "); println("1: " + 1 + 1.1 );
    print("\"1: \" + (1 + 1.1) = "); println("1: " + (1 + 1.1) );

    print("1 + 1.1 + \"1\" = "); println(1 + 1.1 + "1"); /* 追記 */
    print("1 + 1.1 + \"1\" = "); println(1 + 1.1 + "1"); /* 追記 */

    print("1 + 1.1 + \"1\" + 2 = "); println(1 + 1.1 + "1" + 2); /* 追記 */

    flag = false;
  }
}

 

出力

1 + 1 = 2
1 + 1.1 = 2.1
"1: " + 1 = 1: 1
"1: " + 1.1 = 1: 1.1
"1: " + 1 + 1.1 = 1: 11.1
"1: " + (1 + 1.1) = 1: 2.1
1 + 1.1 + "1: " = 2.11:  ←追記分
1 + 1.1 + "1" = 2.11 ←追記分
1 + 1.1 + "1" + 2 = 2.112 ←追記分

 

眺める

1行ずつ見てみます.
小数点の型サイズは知らないので,floatということにしておきます.

1 + 1 = 2
int + int で int,加算.

1 + 1.1 = 2.1
int + float で float,加算.

"1: " + 1 = 1: 1
String + int で String int,連結.

"1: " + 1.1 = 1: 1.1
String + float で String float,連結.

ここまでは大抵,文字列と数値を分かりやすく出力したい場合だと思います.
そして,その意図通りに出力されています.

"1: " + 1 + 1.1 = 1: 11.1
String + int + float で String int float,連結.

これが予想外でした.
+演算子でどちらをしてほしいか,なんてスケッチを書いている側の中にあるのです.
しかし,処理する側からするとどれも同じ+演算子なわけで,使い分けなどできません.
記号って,だから記号なんだよね,とか思ったり.

"1: " + (1 + 1.1) = 1: 2.1
String + (int + float) で String float,連結・加算.

()をすれば,()内の演算子の処理は()内で決めるよ,ということみたい.

 

追記分
1 + 1.1 + "1: " = 2.11:
int + float + String で float String,加算・連結.

1 + 1.1 + "1" = 2.11
int + float + String で float String,加算・連結.

追加分直前と少し変わって,数値の計算がされた後に文字列連結されました.
"1"が'1'になって値か,"1"が1として計算されるのかと予想していました.

Java演算子メモ(Hishidama's Java Operator/Expression Memo)
によると左連結とのことなので, (((1) + 1.1) + "1: ")
となり,全ての+演算子が加算が決まりそうですが,違うようです.

1 + 1.1 + "1" + 2 = 2.112
から分かるように,Stringが出現するまでは加算,出現したらそれ以降は連結に切り替える,という感じ.

 

結論

print()/println()で+演算子を使用する場合,数値だけならば加算になるが,文字列を含むと連結になります. Stringが出現するまでは加算,出現したらそれ以降は連結に切り替わります.
また,()演算子内では個別に加算/連結 が決定されます.