加算とストリング連結は同じ記号「+」
算術演算子の加算とストリング演算子は、同じ記号(+)を使用します。
ここに ' a + b ' という式があります。これは加算式でしょうか。それともストリング連結式でしょうか。Flashは、2つの違いをどうやって判断しているのでしょう。
もちろん、これだけでは判断できません。判断の基準となるのが、2つのオペランド( a , b )のデータ型です。
もう一度、各演算子の処理内容を思い出してみましょう。算術演算子は、数値オペランドに算術演算を加え、結果を数値で返す演算子です。これに対し、ストリング演算子は、2つのストリングオペランドを連結し、結果をストリングで返します。
演算子 |
オペランドの型 |
処理内容 |
評価結果の型 |
算術演算子 |
数値 |
算術演算 |
数値 |
ストリング演算子 |
ストリング |
ストリング連結 |
ストリング |
もうお分かりですね。Flashは ' + ' 記号を、2つのオペランドが数値であれば「加算演算子」、ストリングであれば「ストリング演算子」として解釈し、実行します。
2つのオペランドの型が違う場合
それでは、2つのオペランドのデータ型が異なるときは、どうなるのでしょう。特にオペランドが数値とストリングのときが問題ですね。
ActionScript は型づけの弱い言語です。演算子が要求するデータ型とオペランドのデータ型が異なるときは、自動的にオペランドの型を変換し、式を評価しようとします。例えば、以下の式は、ストリングが数値に変換されて評価されます(詳しくは「数値とストリングの型変換」を参照)。
n = "30" - "15" ; // nは15
n = "20" / 10 ; // nは2
n = 10 * "5" ; // nは10
しかし、加算の場合は、例えストリングオペランドが半角数字(1バイト)であっても、「ストリング → 数値」の変換は行われません。これは、加算演算子とストリング演算子が同じ記号(+)を使う特殊事情によるものです。では、どうなるのでしょうか。答えは、上の例の逆、数値オペランドがストリングに変換(数値 → ストリング)されます。
具体例で見てみましょう。
s = "11" + 1 ;
という式の場合、左オペランドの "11" がストリング、右オペランドの ' 1 ' が数値です。オペランドの片方がストリングのため、ActionScript はこの式をストリング連結式とみなします。そして、数値オペランドの ' 1 ' をストリングに型変換して("1")、式を評価します。結果はストリングの "111" となります。
なお、複合代入演算子(+=)の場合も同様な型変換が起こります。別の例でまとめてみましょう。
結果は1の式が"10030105"、2の式が"1405"となります。
上の式が実は間違いで、オペランドがすべて数値のつもりであった場合のことを考えてみましょう。例では数値やストリングをそのまま記述していますが、実際のスクリプトでは変数を使用するケースが多く、このような間違いはよく起こります。評価結果は、数値の' 145 'になります。さらに、この値を加算以外の算術、等価、比較演算子のオペランドとして使用するとどうなるでしょうか。例えば ' s / 5 ' という式で考えてみましょう。本来は ' 145 / 5 ' で ' 29 ' となるはずの評価結果が、1式では ' 10030105 / 5 ' で ' 2006021 '、2式では ' 1405 / 5 ' で ' 281 ' となってしまします。値が大きく違いますね。
このように、加算演算子を使用するときは、オペランドの型を間違えないようにすることが重要になってきます。
・関連項目