为什么Delphi 6警告变量" i"可能没有初始化?

时间:2014-09-18 04:19:44

标签: delphi compiler-warnings

优化开/关并不重要。这是用于演示警告的简化代码。在原始例程中,所有赋值和比较都是可以返回各种值的函数表达式。

procedure test;
var i, k: integer;
begin
k := 21;
repeat
  if k = 20 then break;
  i := 5
until i = 5;
end;

2 个答案:

答案 0 :(得分:8)

这似乎是编译器的一个弱点。

repeat
  if k = 20 then break;
  i := 5
until i = 5;

人工静态分析可以轻松检查i在读取之前是否总是被分配。 until之前的行分配它。如果break跳过该分配,则也会跳过until测试。

因此,这只能被描述为编译器错误,因为编译器应该能够理解breakuntil的交互方式。很明显,编译器的分析取决于对这些事情的理解,因为删除break也会删除警告。所以它只能是编译器不能很好地理解。

事实证明,32位Windows编译器在当前的Delphi版本XE7中的行为方式仍然相同。但64位编译器正确地不会对您的代码发出警告。

请注意,您可能希望编译器意识到代码中if测试中的条件始终会评估False。好吧,编译器不会。它不执行通过非常数变量的常量传播的静态分析。它的分析不考虑您在变量中放置的值。

答案 1 :(得分:0)

Delphi警告你的原因是局部变量没有自动初始化。这意味着什么?这意味着如果你尝试读取任何这样的变量,它将返回一些或多或少的随机结果(它指向的内存的内容)。

因此,只要Delphi识别出在写入任何内容之前可能会读取某个变量的可能性(变量的初始化会将默认值写入其中),就会引发警告。
如果“k”的值为20,则会在代码中发生这种情况,因为“i:= 5”行将被跳过。

你如何在你的情况下解决这个警告?只需在任何循环或任何条件语句之外将某个值设置为“i”。例如:

procedure test;
var i, k: integer;
begin
  //Set initial value for i
  i := 0;
  k := 21;
  repeat
    if k = 20 then break;
    i := 5
  until i = 5;
end;