2009-04-28 115 views
0

[编辑]糟糕有代码中的一个错误,并且现在所有的问题的响应似乎的bizzare,但基本上为用来为,(I = 0回路;我< 15;我+ + )。 [/编辑]初级for循环问题

我想做一个for循环,检查一个16元素的数组,所以它循环从0到15.然后我使用我的变量,然而有时我== 16,由于出界而导致问题。

我有一个解决方案,但它似乎并不高雅,这让我觉得我失去了一些东西。我试过while循环,但是我还没有得到任何环路去从0到15,并且永远不会结束在大于15

值有什么办法让一个循环去检查的所有16种元素该数组,而在循环结束时从不大于15?

int i; 

for(i=0; i<16; i++) 
{ 
    someClass.someMethod(i); 

    if(someClass.Test()) 
    { 
     break; 
    } 
} 



if (i == 16) 
{ 
    i = 15; 
} 
+4

错误:ECANTFINDQUESTION – Alnitak 2009-04-28 22:50:12

+0

对不起球员,它的意思为:(i = 0; I <16;我++)我要去编辑它,但它会让很多答案的声音题外话:S – LearningFast 2009-04-28 22:52:02

+0

围棋提前编辑它:)这是值得的,使问题适当。 – 2009-04-28 22:53:46

回答

6

我使用一些其他的变量以外i建议你的循环结束后。使用for循环而不是while循环的条件是,您事先知道for循环将执行多少次。如果你已经知道这一点,只需设置一些其他变量到你的循环的结束值并使用它,而不是给予i双重目的。

int j = 15; 

for(int i=0; i <= j; i++) 
{ 
    someClass.array[i]; 
} 

// continue on using j, which value hasn't changed 
3

那么对于初学者,您的示例代码循环从0到14,但如果你从循环0到15,当然,我必须是16 之前的循环可以结束。会发生什么,它变成了16,那么你的循环会发现它超出界限并发生爆发。如果你想让它以15结尾,老实说,最简单的事情就是在循环结束后递减。

0

你一定错过了什么。

在这个循环中,它甚至不会达到15,你需要说我< = 15,只要我= 14它会运行一次并保释。

3

i增加对上次检查是16,这是不低于15,所以循环退出时我是16

1

所以 - 如果你正在检查一个16元素的数组,通常你可以这样做:

for(i=0; i<16; i++) 

如何为作品,它有三个的第一条语句开始:

i=0 

然后它支票,在第二个语句:

i < 16 // True here, since 0 < 16 

这发生在你的循环之前。然后,它运行在您的循环与该组块:

someClass.array[i]; //0 

最后,它的最后陈述:

i++ 

然后重复第二和第三的语句,在一个序列。

最后运行之前,我== 14,那么它就是我++,我设置为15,并执行该块。最后,它确实我++设置:

i==16 

此时,条件不再为真:

i < 16 // False, since i==16 

在这一点上,你的块不执行,但是我仍然被设置为16 。

0

for环是等效于以下while循环:

i = 0; 
while(i < 16) { 
    someClass.array[i]; 

    i++; 
} // while 

i需要达到16才能正确退出循环。

3

也许是有用知道:

for (before; check; after) { body } 

是一样的:

before 
while(check) { 
    body 
    after 
} 

如果你觉得在你对这个词循环,也许你会很容易发现为什么我在出口处,是16.

0

从技术上讲,有些方法可以编写循环,使得i在退出循环时为15,但不应该这样做:

int i = 0; 
while (1) { 
    someclass.someMethod(i); 
    if (i < 15) { 
     i++; 
    } else { 
     break; 
    } 
} 

是的,它的确如你所说。但流量很可怕。

0

你不能用内置的循环结构来实现这个功能,就像Bill Lizard所说的,你可能真的不想重复使用for循环变量。

但是,如果你真的想,这是一个办法。诀窍是把循环条件在循环的中间:

​​
0

关键的问题在这里明白的是,有17个不同的答案的问题“导致什么样的价值我的测试取得成功?” 。或者我可以在{0,1,...,15}中,或者没有i的值导致测试成功,在这种情况下由i == 16表示。所以如果我只限于16个值,这个问题就不能回答。

有合理的情况下,你不想超过最后的有效值。例如,如果您有256个值,并且出于某种原因,您只有一个字节可用于计算。或者,正如我最近所发生的那样,您只想检查数组中的每个第i个元素,迭代器的最后一个添加将使您远远超出数组的末尾。在这些情况下,循环展开是必要的。

然而,对于这个问题,将清洁剂使用标志:

bool flag = false; 
for (int i = 0; i < 15; ++i) 
{ 
    someClass.someMethod(i); 

    if (someClass.Test()) 
    { 
     flag = true; 
     break; 
    } 
} 

那么很明显与否的测试人成功。

0

如果你的循环以natuarally结束,而不是休息,i为16.没有办法避免这种情况。您的代码,如果你想要的是我结束了15个或更少完全可以接受的:

int i; 
for (i=0; i<16; i++) { 
    someClass.someMethod(i); 
    if (someClass.Test()) 
     break; 
} 
if (i == 16) 
    i = 15; 

凡是循环体后改变i从16到15就可以了:

if (i == 16) i = 15; 
i = (i == 16) ? 15 : i; 
i = MAX (15,i); /* where MAX is defined :-) */ 

和等等。

但是,假设i将被用作与该循环相关的后置条件。我发现情况很少,人们倾向于在重用之前重新初始化它(例如另一个循环)。

此外,你在做什么使得很难(不可能,甚至)找出后置条件,你的循环是否正常终止或者它是否过早终止,因为someClass.Test()i == 15返回true。这意味着使用我做出进一步的决定充满危险。

我的问题是:为什么你认为你需要离开i为15或更少?

0

I am trying to make a for loop, that checks a 16 element array, so it loops from 0 to 15. I then use the i variable later, however sometimes i == 16, which causes problems by being out of bounds.

您需要检查您的for循环没有中断的情况,因为这些信息决定您是否想要对i执行任何操作。

有几种方法可以做到这一点。其中一个就是用一个bool来跟踪它,比如“foundClass”或者“testSucceeded”。默认为false,然后在休息时将其设置为true。随后在“if(foundClass){}”块中的函数中包含我的任何用法。

另一个就是做你所做的事情。虽然你的退步看起来并不正确。如果你将我设置为15,那么你对你的代码撒谎,并告诉它,someClass.Test()成功为i == 15,这是不正确的。避免将值设置为错误,以便稍后您的代码不会出错。稍后在代码中对我的实际使用进行边界检查会更好。

3

您的方法似乎存在一些基本缺陷。

  1. 你不应该在循环范围之外使用索引变量。
  2. 您应该使用变量或函数来确定循环的限制。
  3. 使用迭代器代替数字索引会更好。
  4. 通用算法可以消除循环的需要。

只要我0.02美元。

0
for(int i=0; i<17; i++) 
{  
    if(i<16) 
    { 
    someClass.someMethod(i); 
    if(someClass.Test()) 
    {   
     break;  
    } 
    } 
    else if(i==16) 
    { 
    i=15; 
    } 
} 
0

,如果你说你有16个元素的数组,你没有定义,使用数组来获取信息(请勿重复信息)

之后,如果你想获得最后一个索引再次使用该数组来获取该信息。

for(int i = 0; i < myArray.length; ++i){ 
     myArray[i].somemethod(); 
} 
// lastindex = myArray.length-1;