コンパイラかく語りき

import { Fun } from 'programming'

JavaScriptで「'6000' - ('40' + '10') * '50'」の答え分かります??

競技プログラミングで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