Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用!=带计数器控制回路_Java_C++ - Fatal编程技术网

Java 使用!=带计数器控制回路

Java 使用!=带计数器控制回路,java,c++,Java,C++,今天的最后一个问题…我明天会回来…我有很多事情要跟进 我在看Reilly Java文本-谈论计数器控制的循环模式…(不管是哪种语言…) 计数器控制循环(for、while等)和嵌套循环的作者…使用!=为了测试…现在我意识到了!=用于事件控制循环(如sentinel或EOF类型的循环)的某些情况,但对我来说,将其用于计数器控制循环是一个坏主意…非常容易出错 示例: x = 0; while (x != 100) { y = 0; while (y != 100) { ...

今天的最后一个问题…我明天会回来…我有很多事情要跟进

我在看Reilly Java文本-谈论计数器控制的循环模式…(不管是哪种语言…)

计数器控制循环(for、while等)和嵌套循环的作者…使用!=为了测试…现在我意识到了!=用于事件控制循环(如sentinel或EOF类型的循环)的某些情况,但对我来说,将其用于计数器控制循环是一个坏主意…非常容易出错

示例:

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)