Java 使用!=带计数器控制回路
今天的最后一个问题…我明天会回来…我有很多事情要跟进 我在看Reilly Java文本-谈论计数器控制的循环模式…(不管是哪种语言…) 计数器控制循环(for、while等)和嵌套循环的作者…使用!=为了测试…现在我意识到了!=用于事件控制循环(如sentinel或EOF类型的循环)的某些情况,但对我来说,将其用于计数器控制循环是一个坏主意…非常容易出错 示例:Java 使用!=带计数器控制回路,java,c++,Java,C++,今天的最后一个问题…我明天会回来…我有很多事情要跟进 我在看Reilly Java文本-谈论计数器控制的循环模式…(不管是哪种语言…) 计数器控制循环(for、while等)和嵌套循环的作者…使用!=为了测试…现在我意识到了!=用于事件控制循环(如sentinel或EOF类型的循环)的某些情况,但对我来说,将其用于计数器控制循环是一个坏主意…非常容易出错 示例: x = 0; while (x != 100) { y = 0; while (y != 100) { ...
x = 0;
while (x != 100) {
y = 0;
while (y != 100) {
...
y++;
}
x++;
}
如果只说..使用其他关系运算符
x = 0;
while (x < 100) { //or even better some defined constant...
y = 0;
while (y < 100) {
...
y++;
}
x++;
}
x=0;
而(x<100){//或者更好的是一些定义的常数。。。
y=0;
而(y<100){
...
y++;
}
x++;
}
从我所看到的,通常是在课文、课堂等中呈现的方式
再一次-你会认为这一切都不好-或只是一个不同的方式做它。。。
谢谢…我相信它们在语义上是相同的,唯一的区别在于!=大于100的数字显然也会满足这样的条件,即as<将阻止任何大于100的数字通过 但是,在给定的情况下,两个运算符将产生相同的输出。现在,如果x和y变量在代码之外被作用,那么“我只会使用
while (x != 100)
如果我希望循环在x正好为100时终止,那么在绝大多数情况下,我会使用
while (x < 100)
while(x<100)
这在计数器控制的循环中更常见
编辑:再想一想,我总是在计数器控制的循环中使用语法,所以这个例子应该是
for(int i=0; i < 100; ++i)
for(int i=0;i<100;++i)
最好在循环中使用小于。代码中的错误可能会导致计数器增加两次。这意味着循环将突然变成无限循环(或者直到你吹出MAXINT)。是的。它们在语义上是相同的
第二种语法使用“您希望循环条件与所需post条件完全相反
i= 0;
while( i != 100 ) {
i += 1;
}
assert i == 100;
您可以很容易地看到,循环post条件与循环终止条件完全匹配。没有秘密
此外,您可以从初始条件和主体证明它将达到100,而不会“以某种方式”神奇地跳过一个值
当你有一个非常复杂的循环体时,简单的并行结构是必不可少的
如果使用从post条件派生循环,则循环条件将是如上所示的简单匹配条件
i<100
是个坏主意,因为您的循环可能有一个不正确的主体,该主体严重增加了变量,并且仍然“似乎”起作用。使用我认为不必提供比!=>更多的保护。如果你有一个案例,i
以你意想不到的方式递增,你应该抛出一个异常,而不是像其他答案所显示的那样,用来掩盖它,
而(i<100)
是安全的*
,
而(i!=100)
是精确的**
另外,您可能想尝试while(i++<100)
或for(i=0;i<100;+++i)
而不是您所展示的更简单的while循环——忘记在循环结束时增加计数器是一件非常痛苦的事情。请注意,如果i=0
,i++
将等于0,然后在下次增加i,而++i
将增加i,然后等于1,因此对于而(i++<100)
,后缀++运算符是必需的
还要注意的是,如果在条件下测试时i
为0,那么在循环体中它将为1(例如,在while示例中),因此如果i
是数组或某物的索引,而不仅仅是跟踪循环迭代,那么最好只使用for循环(每次迭代后增加i)
*
:此处安全意味着不太可能进入无限循环。它也不安全,因为它可以隐藏潜在的错误,如果循环不是琐碎的
**
:准确地说,如果它没有完全按照您的期望执行,它将失败,您会注意到。一些其他的答案也描述了如何在这种循环中更有效地保护你。 < P>使用“=!”超过“的主要优点,我怀疑这可能与C++迭代器有关。
如果您使用的是整数或指针,假设x
和y
是整数类型,那么什么会使!=
版本更容易出错?如果有人在循环中错误地将x设置为101,循环将继续运行。我知道这些是相同的东西…在OPs示例中没有显示,但这是一个尝试od点。当测试x!=100时,当代码从99跳到101时会发生什么?在这个例子中没有什么神奇之处,但如果初始条件或增量值在运行时之前未知,则可能会发生。即使在运行时之前不知道情况,WP技术也会产生一个正确的循环——该循环会终止——并且总是会发生s在循环中具有最弱的终止条件。它还可能产生一个保护(if语句)作为阻止循环运行的前提条件,如果边界会导致非终止循环。为什么不使用i<100并断言i==100?按照您介绍的方式,如果跳过100,循环将永远不会终止,并且您将永远没有机会断言它是否正确。使用我的方法,您可以保证它是正确的100,而不会陷入无限循环中。这两个世界都是最好的,不是吗?关键是,如果100被“不知何故”跳过,你就有一个bug。循环需要崩溃,并且崩溃得很厉害。无限循环是另一个bug的症状,你必须找到并修复它。在开发/调试时,不要绕过它
x = 0;
while (x != 100)
{
assert x >= 0;
assert x < 100;
y = 0;
while (y != 100)
{
assert y >= 0;
assert y < 100;
...
y++;
}
x++;
}
for(std::list<foo>::const_iterator i = bar.begin(); i != bar.end(); ++i)