how continue, the jump statement affects for loop in c#
我在读C-Sharp 7.0简而言之-约瑟夫·阿尔巴哈里,在跳转语句部分,有一个类似于
1 2 3 4 5 6
| for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i +"");
} |
输出为:1 3 5 7 9
但是当我像下面这样评论ContinuJump语句时
1 2 3 4 5 6
| for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
//continue; // continue with next iteration
Console.Write (i +"");
} |
输出为:0 2 4 6 8
有人能解释continue语句如何影响循环流吗?
- 删除注释并重新缩进。它会神奇地显现出来。
- 您的代码现在是if ((i % 2) == 0) Console.Write(i +"");。
- 这看起来是一个在调试器中单步执行代码并观察发生了什么的好机会。当你这样做时,会发生什么?你期望会发生什么?为什么?
- 如果我错了请纠正我,第一个代码说当数字是偶数时继续写奇数!!,对吗?
- @瓦沙克:第一个代码说"如果数字是偶数,就跳过它。"否则(如果是奇数),写它,"第二个代码说"如果数字是偶数,写它。否则(如果很奇怪的话),什么也不做,"你还期待着什么样的输出呢?为什么?
- C程序通过用空格替换注释而保持不变。将您的"前"和"后"程序都带上,并用空格替换所有注释。你知道现在这是两个不同的程序吗?
- @大卫,我是新来的编程人员,我还在学习,我并没有期望任何东西只是想理解。
- 这个步骤调试器解决了许多谜团,回答了许多问题,并且可以预先回答许多这样的帖子。谷歌可以回答更多
- 我认为您可能期望一行代码是一条语句。这完全是错误的。C将换行符、空格、注释等处理为相同的内容——只是空白。(除了一些例外,如逐字串中的换行符)EDOCX1的主体是它后面的语句;通过注释continue;,您将下一行放入if的主体中。
- @瓦沙克:"我什么都没想到"——我想这个问题已经被回答了。编写代码,观察输出。没有什么比预期的不同,所以没有问题要解决。如果您只是在问continue语句做了什么,那么有文档可以说明这一点。您还有一个非常合理的示例(您的第一个代码)来演示它。
- stackoverflow.com/questions/6414/&hellip;
- @大卫,是的,我理解。谢谢。
- 我投票决定结束这个问题,因为似乎没有问题需要解决。不管怎样,这个问题都不清楚。
- 对于那些吵吵嚷嚷要投反对票的人,看看他/她的代表,记住我们在某个阶段都是初学者。
我认为,你的基本困惑与这样一个事实有关:注释一个语句会完全删除该语句。它没有做出"什么都不做"的声明,这就是当时的if的主体。
然而,我认为对于continue所做的工作也有一种困惑。理解这一点的一个好方法是将其简化为更简单的内容。
假设你有
1 2 3 4 5 6
| for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0)
continue;
Console.Write (i +"");
} |
让我们把它简化为一个更简单的程序,从这个意义上说,for比较复杂,while也比较简单。您的程序片段与以下内容相同:
1 2 3 4 5 6 7 8 9 10 11
| {
int i = 0;
while (i < 10)
{
if ((i % 2) == 0)
goto DoTheLoopIncrement;
Console.Write (i +"");
DoTheLoopIncrement:
++i;
}
} |
同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| {
int i = 0;
DoTheLoopTest:
if (i < 10)
goto DoTheLoopBody;
else
goto DoneTheLoop;
DoTheLoopBody:
{
if ((i % 2) == 0)
goto DoTheLoopIncrement;
Console.Write (i +"");
DoTheLoopIncrement:
++i;
goto DoTheLoopTest;
}
}
DoneTheLoop:
... |
注意"goto"版本的阅读时间和难度有多大。这就是我们使用while和for的原因。但你必须明白,这正是while、for和continue所做的,以便理解它们的控制流。它们只是一种写书的愉快方式。
现在:你明白break的意思吗?休息只是写《江户记》的一种愉快的方式。
- 我的问题看起来像是我对评论的事情感到困惑,实际上不是,我知道评论符号的作用,我试图理解Continue语句是如何影响循环的流程的,现在我明白了,谢谢你帮助我理解Goto和Break语句,很高兴得到一个在书中提到的人的回复。微软博客上的数组文章。
- @瓦沙克,我想说,得到一个设计C的人的答复,会更好。
- @我不知道,真的很好。我觉得这是个愚蠢的问题,因为人们让我这样想,但埃里克·利珀特回答得很亲切,也很容易理解。
- @我不认为有"错误的问题"…堆栈溢出问题中的向下投票通常意味着"自己没有足够的研究问题"或"以前没有努力自己回答问题"…但不提出问题是学不到的。这是一个先让他们对你自己,然后试着自己回答他们的问题(如果你不能,那就问问其他人)。这就是所谓的"研究":-)。这在一段时间前是很困难的,但是现在有很多信息在你的指尖上。
- @JCL我不在乎投反对票,但这里的人表现得像是为什么用这种愚蠢的问题来烦我们,你问过谷歌吗?!!!不管怎样,谢谢你的鼓励和贴士。
- @Washaq在堆栈溢出中有超过800万用户。不要因为以下几点而气馁:—)
如果没有大括号,C_将编译下一条语句,以便在if的条件为真时执行。注释不是语句。这是一个主要的原因,它最好总是包括花括号,即使只有一个声明。
continue告诉程序跳到循环的开始并重新测试条件。在这种情况下,将跳过Console.Write调用。
还有一个break,它完全结束循环,不重新测试条件。
- 抱歉,我不明白,我不是在问评论如何改变声明,而是在问Continue Jump语句如何影响它。
- 您删除了有条件执行的行。下一行就变成了那种情况下的那一行。
- 那么,继续说,如果数字是偶数,继续写奇数??
- continue只是跳回到循环的开始。之后的任何逻辑都将被跳过。
- @瓦沙克:不,continue只是简单地说"停止执行循环的这个迭代,开始下一个迭代。"continue本身与偶数/奇数无关。你的困惑来自你的if块,而不是continue。
- stackoverflow.com/questions/6414/&hellip;
- @丹妮拉。怀特,谢谢,现在一切都清楚了。
格式错误:
1 2 3 4 5 6
| for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i +"");
} |
更好的格式:
1 2 3 4 5 6 7
| // Output is : 1 3 5 7 9
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i +"");
} |
不使用"继续"功能:
1 2 3 4 5 6 7
| // Output is : 0 2 4 6 8
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
// continue; // continue with next iteration
Console.Write (i +"");
} |
最佳格式:
1 2 3 4 5 6 7 8 9 10 11
| // Output is : 1 3 5 7 9
for (int i = 0; i < 10; i++)
{
// If i is even,
if ((i % 2) == 0)
{
// continue with next iteration
continue;
}
Console.Write (i +"");
} |
- 是的。我认为在大多数编程课本中,正确的格式和缩进都被低估和省略了,而我将把它作为一项基本技能来学习,作为下一章的先决条件。
- @eugenesh.:我有时听说所有程序员都应该学习python,如果不是因为其他原因,而是为了理解空白是很重要的。(即使它对编译器不重要,对代码也很重要。)
- @尤金:谢谢,我同意。更重要的是,我怀疑这些"格式化的示例"可能会帮助操作人员更好地理解底层问题,而不是"冗长的解释"。
- 我会记住这一点,也会警告作者。
- 可能值得一提的是,您可以要求vs使用edit->advanced->format document为您格式化代码。(通常但不总是ctrl-k、ctrl-d)。在C中,这几乎总是一个精确的指示,指示编译器将如何解释代码。
Continue将忽略循环内的所有语句,并继续下一个迭代。