競技プログラミングで3分ほどハマった。検証が楽しくてさらに10分ほどハマった。

 

6000 -  (40 + 10) * 50 の結果です。

パット見で分かりますか??? は文字列を表します。

 

ふつうに数値として計算したら、3500ですよね。

ところが答えは -194500です。これがJavaScriptの罠であり魅力です。

 

文字列と数値の変換

例えば、以下の算術はうまくいきます。

60 - 10  => 50

6 * 4 => 24

100 / 4 => 25

 

マイナス、かける、割るという演算子は、数値の演算だからです。データ型が文字列でも、数値型へと自動変換してくれます。

 

プラス演算子

ところが、プラス演算子は別です。これは数値の演算以外にも、文字列の結合もします。

 

10 + 5 => 105

 

おっと!これはビックリですね。

 

どちらか片方が数値でも、文字列結合になります。

10 + 5 => 105

10 + 5 => 105

 

両方が数値のとき初めて、数値加算が行われました。

10 + 5 => 15

 

冒頭の演算は、まず最初に文字列結合が行われていたんですね。。。

6000 -  (40 + 10) * 50 

カッコ内がまず 4010 となっていたようです。

6000 - 4010 * 50 => -194500

 

応用

では、以下はそれぞれどうなるでしょうか。

hello + 10 + 5

10 + hello + 5

10 + 5 + hello

 

結果はそれぞれ、hello105, 10hello5, 15helloとなります。

+ 演算子は左から実行されるので、最後のケースのみ、数値どうしの加算が行われます。

逆に言うと、他の2つは10 + helloの時点で文字列結合が行われ、その後の + 5も文字列結合となります。

 

このようにすると、数値演算が行われます。

hello + (10 + 5) => hello15

最終的には文字列になってしまいますが。。。

 

対策

とは言え、10 + 5 ならば数値同士の加算がしたいと分かります。

では、以下の場合はどうでしょうか。

a + b

a, bには何が入るかわかりません。ただ、何が来たとしても、まずは数値加算を優先したいとします。(プラス演算子は文字列を優遇します。きっと文系ですね)

 

そんな時、 自分で関数を書けば良いのです。JavaScriptたのしいですね。

 

関数の作成は、また次回にしようと思います。

 

次回:

chuckwebtips.hatenablog.com

 

 

参考:

www.ajaxtower.jp