此代码是我在我的应用程序中使用的第三方组件的一部分。 我正在尝试解决与我的应用程序中的提示相关的所有可能问题。 但我无法理解这一点。 Delphi Compiler标记此代码的第一行以提示"分配给NewState的值从未使用过! 我只是想了解情况
NewState := STATE_UNCHECKED; //Value assigned never used?Really?
while ( Node <> nil ) and ( Node.Parent <> nil ) do
begin
Node := Node.Parent.GetFirstChild;
CheckedCount := 0;
UnCheckedCount := 0;
while True do
begin
....
if ( Node.StateIndex = STATE_PARTCHECKED ) or
( ( CheckedCount > 0 ) and ( UnCheckedCount > 0 ) ) then
begin
NewState := STATE_PARTCHECKED; ///assign value on condition
Break;
end;
if Node.GetNextSibling = nil then
begin
if CheckedCount > 0 then
NewState := STATE_CHECKED //assign value on condition
else
NewState := STATE_UNCHECKED;
Break;
end
else
Node := Node.GetNextSibling;
end;
Node := Node.Parent;
if Node <> nil then
SetState( Node, NewState );
end;
但是当这两个判断都是假的时候必须使用这个值。我错了吗?
if ( Node.StateIndex = STATE_PARTCHECKED ) or
( ( CheckedCount > 0 ) and ( UnCheckedCount > 0 ) ) then
和
if Node.GetNextSibling = nil then
更新
答案是正确的。只有在为变量分配新值并覆盖第一个值后,Break Statment才会运行。然后从未使用过赋值。
最小,完整且可验证的例子:
procedure TForm1.btn1Click(Sender: TObject);
Var x,y,z,k:integer;
begin
X:=1;
Y:=strtoint(edit1.text);
Z:=Strtoint(edit2.text);
K:=Strtoint(edit3.text);
while true do
begin
If Z=y*2 then
begin
X:=2;
Break;
end;
If Y=3 then
begin
If K=7 then
begin
X:=3;
Break;
end
else
begin
x:=6;
Break;
end;
end
end;
showmessage(inttostr(x));
end;
答案 0 :(得分:8)
如果您突出显示的语句都为FALSE,则 while True 循环继续。退出此循环的唯一方法是分配NewState值。所以编译器是正确的。
答案 1 :(得分:2)
首先,你误解了“被使用”的概念。在这种情况下,它意味着“ 你似乎认为这意味着“再次引用变量名称”;所以你错误地想到现有的值被覆盖它正在被“使用”。
您显然没有显示所有代码。丢失的代码是否相关?没有看到它,我无法确定。
但是从显示的代码中:第一行中分配的值将被覆盖,而不会在while True
循环中读取。即初始分配 从未使用过到此为止。但是,由于条件代码是否已经到达,是否达到这些行是不明确的。
NewState
正如Dsm指出的那样,在 做 显示的代码中,实现目标的唯一方法是在之后立即突破<{1}}循环 / em> 覆盖初始值。
你没有说你正在使用哪个版本的Delphi,但我不认为旧版本能够解决这个稍微复杂的案例。应该指出的是,编译器无法做出准确判断的情况确实很复杂。但由于此警告涉及编译器从编译输出中删除该行,因此通常仅在逻辑清楚地指示未使用时报告这些情况。