次のコードをコンパイルし、実行してみましょう。

#console
Dim x As QWord
x = 9876543210

Dim i As Long
For i = 0 To 9
	Print x Mod 10, Space$(i); x
	x /= 10
Next

Sleep(-1)

次のような出力になるとお思いのことでしょう。私もそうでした。

0        9876543210
1         987654321
2          98765432
3           9876543
4            987654
5             98765
6              9876
7               987
8                98
9                 9

しかし、実際にはこうなります。

0        9876543210
9         1315666339
5          1291514245
4           1291212344
0            1291208570
3             1291208523
3              1291208523
3               1291208523
3                1291208523
3                 1291208523

明らかにバグです。ただし、ABコンパイラのバグでもありますが、ソースコードにもバグがあると言っても構わないと思います(だったらコンパイラで警告でも出してほしいところですが)。さあ、わかりましたか?

最初に書いたような想定どおりの出力になる答えはx /= 10x \= 10にすることです。そう、除算代入演算子の左辺が整数型だった場合に左辺の値がおかしくなるようです。DWordやLongでも同じようにだめでした。

なお、x = x / 10にしても出力は正しくなりますが、SingleをQWordに変換したという警告が出力されます。除算代入演算子でも同様に警告(もしくはエラー)になってほしいところです。


そんなわけで整数除算演算子 \をうっかり忘れるとこういう痛い目に合うという話でした。最近Cでvoid f(x As Doubleと書いてしまう自分がいました。色々な言語間を行き来する際にはよく注意が必要です。

スポンサード リンク

この記事のカテゴリ

  • ⇒ 除算の罠