理解 for 循环逻辑

Posted

技术标签:

【中文标题】理解 for 循环逻辑【英文标题】:Understanding for loop logic 【发布时间】:2014-10-03 22:52:04 【问题描述】:

这个问题不是需要解决的问题,而是我的代码的一个方面,我希望在理解方面有所帮助。

我首先在屏幕中间画一条线,以便更容易解释我不理解的内容。

用户可以输入每行之间有多少像素。

循环说明:它从左侧 Y 轴的中间到右下角画一条线,然后重复该操作,通过 userInput 增加 startY 整数并减少相同数量的 endY 整数,直到已到达框架底部。

g.setColor(Color.RED);
    g.drawLine(startX, getHeight() / 2, endX, getHeight() / 2);
    g.setColor(Color.BLACK);

    for (int startY = getHeight() / 2; startY <= bottom; startY += userInput) 

        g.drawLine(startX, startY, endX, endY);
        endY -= userInput;

    


这是效果:http://i.imgur.com/TUpvI10.png

现在当我切换这些代码行时:

g.drawLine(startX, startY, endX, endY);
endY -= userInput;

endY -= userInput;
g.drawLine(startX, startY, endX, endY);

这是效果:http://i.imgur.com/zm1ubfn.png

如您所见,它在右侧画了一条额外的线,这意味着循环执行了额外的时间,对吗?我不明白为什么。两个版本的循环不应该同时停止(到达帧底部时)吗?

那么为什么当我切换这些语句时循环会执行额外的时间?

我很困惑,我很难理解这个逻辑。

【问题讨论】:

顶部有一个“额外”行,但底部还有一个“缺失”行。 (实际上,没有缺失或多余的行,但所有行都略微上移了) 【参考方案1】:

在这两种情况下,当到达框架的底部时,它会最后一次绘制线。

在第一种情况下,它从底部到顶部绘制线,然后递减 endY 变量(在这种情况下不再相关)。在第二种情况下,它首先递减,这就是为什么这条线会超过你的红线。

如果您无法理解这一点,请尝试将每行之间的像素设置为更大的数字,然后尝试在您的脑海中遍历 for 循环。拿一张纸,写下所有变量以及它们目前存储的数字。可能自己也在纸上画线;)

【讨论】:

好主意,我要试试这个。【参考方案2】:

实际上,循环不会再次执行,但您的输出偏移了userInput 像素,正如人们所期望的那样,因为您在绘制之前减少了 endY

【讨论】:

以上是关于理解 for 循环逻辑的主要内容,如果未能解决你的问题,请参考以下文章

使用Java语言深入理解程序逻辑——循环结构进阶

使用Java语言深入理解程序逻辑——循环结构进阶

R:试图理解逻辑以用lapply()替换循环

小白学习C++ 教程四C++逻辑运算符While循环和For 循环

具有逻辑或语法问题的 for 循环

for循环语句内加数字的逻辑