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が出現するまでは加算,出現したらそれ以降は連結に切り替わります.
また,()演算子内では個別に加算/連結 が決定されます.