VBScriptを触る機会があり、ちょっと不思議な挙動に出くわしたので書いてみる。
その道の人には既知かもしれないし、今後あまり触れることもないだろう。
比較演算子の挙動
公式のリファレンスをみましょう。
https://msdn.microsoft.com/ja-jp/library/cc392349.aspx
下の方に値に応じた処理内容の表がありますが、この中に一部気になる条件があります。
「一方の式が数値、他方が文字列」 => 「数式の方が文字列式より小さくなります。」
何を言っているのかよくわかりませんね。どうやら数値に落としての比較はしないってことのようです。
なんとなく期待される挙動としてはこういうことでしょうか。
10 < "a" '=> True
10 < "5" '=> True
しかし、現実は違います。
10 < "a" '=> Error: 型が一致しません。: '[string: "a"]'
10 < "5" '=> False
どうやら、暗黙的に数値にキャストして比較してしまうようです。公式リファレンスとは何だったのか…。
変数に格納すると挙動が変わる
ところが、ちょっとだけ変化を加えるだけでリファレンス通りの挙動になります。
Dim n
n = 10
n < "a" '=> True
n < "5" '=> True
変数に格納しただけで暗黙的なキャストが効かなくなるようです。
なんでしょうね、このキモい挙動は…。
まとめ
ちゃんと比較したいなら CLng
などで明示的にキャストしましょう。