- ベストアンサー
For ステートメントについて
Dim t As Byte と宣言をした上で 次のコードを書くと For t = 1 To 10 Step 1 Next t 通常に実行されます。ところが、 For t = 10 To 1 Step -1 Next t とするとオーバーフローします。 Dim t As Integer とすると上手くいくことから t が負の数に対応していないからだと思いますが、t が負の数になることはありません。これはなぜなのでしょうか? 。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
例えばFor文の次にDebug.Print tとか書いて実行させてもイミディエイトウィンドウには何も表示されません。ループには入っていないのです。またエラーで止まった状態でtの値を見ると直前の値(セットしていなければ0)のままです。要するにtは関係ないんです。 では何がオーバーフローしているのかと言えば、Step -1の-1です。これはあくまでも推測ですが、ループ変数(t)がByte型なのでStep値をByte型で扱おうとしてエラーになっているのでしょう。 通常の演算(代入文とか)では、自動的に型変換が行なわれるので、Byte型であっても例えばt-1.5なんて演算もできてしまいます(イミディエイトウィンドウで試してみて下さい)。もちろんこれをt=t-1.5のようにByte型に代入しようとすれば、型変換により小数部は丸められ(精度落ち)、さらに整数部がByteの範囲外であればエラーになります。 ループでこのような型変換を毎回行なっていては当然実行速度が遅くなってしまいます。なのでStep値をあらかじめループ変数の型に合わせておき、演算を高速化しようとしているのでしょう。で、-1をByte型にしようとしてエラーを起こしていると。 ま、あくまでも推測ですので念のため(^^;
その他の回答 (2)
- torokichi
- ベストアンサー率0% (0/3)
Byte宣言しなくてはならないのですか? Integer宣言でも良いのなら、Integer宣言すれば良い。 Byte宣言しなくてはならないなら、ループ部をIntegerにして、CByte関数で型変換する。
お礼
回答ありがとうございました。 別にByte宣言する必要はないです。ただ t に負の数も、少数も使うことがなかったのでなるべく小さい物を使おうとしたからです。しかし必要性はありませんが、ステートメント中で t が負になる事がないのにオーバーフローしてしまうことに疑問を持ちました。t=10, 9, 8, ... ,1ではないのでしょうか。
- imogasi
- ベストアンサー率27% (4737/17069)
前段だって254まではOkで、255ではエラーです。 Sub test01() Dim t As Byte For t = 1 To 255 Step 1 Next t End Subはエラーとなる。ご存知でしたか。 1バイト8ビット、0から255までの2進数として「無理に」(数に変換して)解釈して実行してくれているのではないでしょうか。 Forの後のtはカウンタ変数と言ったと思いますが、カウンターにバイト型をなぜ当てはめるのでしょうか。原理的な勉強は私もしたいが、Integerで何ら困らないと思うのですが。素人に計り知れない深い理由でもあるのかな。
お礼
回答ありがとうございました。 別にByte宣言する必要はないです。ただ t に負の数も、少数も使うことがなかったのでなるべく小さい物を使おうとしたからです。しかし必要性はありませんが、ステートメント中で t が負になる事がないのにオーバーフローしてしまうことに疑問を持ちました。t=10, 9, 8, ... ,1ではないのでしょうか。
お礼
回答ありがとうございました。 確かに Step値を t と同じ型で扱っていると考えると納得がいきますね。ここまでは何となく考えられたのですが、演算の高速化をはかるため、とまでは考えませんでした。 推測とはおっしゃっていますが、私はこれが正しいと思います。