The Delphi Bug List

Entry No.
494
コンパイラ - コード生成
for 文で Low(integer) と High(integer) を使用すると、誤ったコードが生成される
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
Absent Exists Exists Exists Exists Exists Exists Exists Exists Exists Exists Exists Exists Exists Exists
解説
Reported by Anders Melander; checked by Reinier Sterkenburg
例:
  for i := low(integer) to high(integer) do
    Label1.Caption := IntToStr(i);
これを D4.x でコンパイルすると、"一度も実行されないforループがあります - 削除しました"というヒントが生成されます。
さらに実験してみると、
  for i := low(integer) downto high(integer) do ;
これがオプティマイザによって削除されません。
low(integer)は負、high(integer)は正であるにもかかわらず、それをIntToStr()で表示してみると、forループはこれらの値を符号無しの DWORD として扱っているように見えます(CPUウィンドウで確認)。
ユーザーからのコメント
bin
30 Jan 2003  01:51 PM GMT
C言語で上の例のような構造を使用すると無限ループになります。その原因は、ループ制御変数が脱出条件としてチェックされるためです。上の例が Delphi でコンパイルされるとどのような構造になるのかを正確には知りませんが、次のような for ループ、

var i: byte;
....

for i:=0 to 255 do;

これはC言語の場合と同じで無限ループにはならないでしょう。これは、この構造がコンパイルされると上のように最適化されるためです。それでも、変数の最小値から最大値へのループは、ラッピングによる副作用を起こす可能性はあります。
30 Jan 2003  01:51 PM GMT
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ