理解 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 循环逻辑的主要内容,如果未能解决你的问题,请参考以下文章