优化开/关并不重要。这是用于演示警告的简化代码。在原始例程中,所有赋值和比较都是可以返回各种值的函数表达式。
procedure test;
var i, k: integer;
begin
k := 21;
repeat
if k = 20 then break;
i := 5
until i = 5;
end;
答案 0 :(得分:8)
这似乎是编译器的一个弱点。
repeat
if k = 20 then break;
i := 5
until i = 5;
人工静态分析可以轻松检查i
在读取之前是否总是被分配。 until
之前的行分配它。如果break
跳过该分配,则也会跳过until
测试。
因此,这只能被描述为编译器错误,因为编译器应该能够理解break
和until
的交互方式。很明显,编译器的分析取决于对这些事情的理解,因为删除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;