我遇到了一个我以前从未见过的奇怪问题。现在我有一个for循环:
var
a,counter: byte;
begin
a:=0;
for counter := 1 to 10 do//I put a breakpoint at this line
begin
a:=a*5;
a:=a+counter;
end;
end;
如果我在上面的一行放置一个断点并尝试进入循环,我就无法做到。调试器立即跨越循环并结束。最后我得到了正确的结果,但我不能一步一步地遵循循环。我的意思是这只是一个简单的例子而不是真正的任务。我只是想知道这种情况何时发生?我绝对记得跟踪循环的所有步骤。我使用Delphi 2010。
答案 0 :(得分:10)
循环中的两行代码都可以完全优化掉;你在循环之外对a
什么都不做,所以两个分配都是不必要的。优化后,编译器将离开
for counter := 1 to 10 do
;
实际上,如果你那里没有断点,那么循环也会被删除,因为它什么也没做。
如果您的代码出现问题,并且上述信息无效(在循环运行后使用变量a
),则需要发布您的实际代码。这个组成的代码非常清晰可分析;实际代码中的问题可能很简单,或者分析起来要复杂得多。
答案 1 :(得分:7)
请参阅关闭优化是否有所不同 - 在项目选项中 - >编译 - >代码生成。
答案 2 :(得分:3)
在对Ken的回答的评论中,Mikayil暗示代码在程序中。 这也是查看代码的合理假设。
所以如果我们设置这样的测试:
Procedure Test;
var
a,counter: byte;
begin
a:=0;
for counter := 1 to 10 do//I put a breakpoint at this line
begin
a:=a*5;
a:=a+counter;
end;
end;
begin
Test;
end.
设置优化:结果 - 正如Mikayil所观察到的那样,没有可能进入循环。
设置优化关闭:结果 - 可以进入循环,就像建议的那样。
现在还要考虑到Mikayil在Ken的回答中提出的问题:
是否无法进入循环是因为a
的本地范围。
Ken回答否,但事实并非如此:
var
a : byte; // scope of a is outside of the procedure
Procedure Test;
var
counter: byte;
begin
a:=0;
for counter := 1 to 10 do//I put a breakpoint at this line
begin
a:=a*5;
a:=a+counter;
end;
end;
begin
Test;
end.
现在无论优化是开启还是关闭都无关紧要,无论如何都可以进入循环。
所以,他的回答是绝对正确的。 (在XE2中测试)
更新:
为了启用步进循环,有三种可能性:
a
。a
插入虚拟操作。喜欢:if (a < counter) then;
这些步骤都不是不常见的调试程序,我发现这个问题都是关于。