2010-12-10 71 views
0

我读过某个地方应该使用for循环,当你迭代某种数组/序列/列表/任何你调用它和一个while循环当你的循环需要停止在一定的条件下。在这方面有什么更好的 - 'for`或'while`

所以,如果我有这样的事情

int len = 0; 

for(; s[len] != '\n'; ++len) { 
    // some processing 

    if (someCondition) { 
     return len; 
    } 
} 

// if done iterating, return len 
return len; 

这样行使用for循环在这种情况下或将一个while循环最好?

回答

5

我想这样可能会写它:

int len; 
for (len = 0; s[len] != '\n'; ++len) { 
    ... 
} 
return len; 

只是因为后来我在for声明中说,该范围是什么我感兴趣的(指数0到第一个换行符)。

我一般的代码是什么样子,在此基础上forwhile之间进行选择,而不是我站在吹毛求疵语义的说法不同的是,从现在开始到“某种范围内”与“周期之间有什么地方一些条件是错误的“。 for我认为这不是一个问题。声明的第三部分是“特别可见的”,其方式是在循环结束时增加一个循环,而我认为这足以证明像使用空白的第一部分那样使用较小的扭曲就足够了。

+1

+1将初始值设定项放在for语句中似乎是个不错的主意。 – helpermethod 2010-12-10 23:00:13

2

for循环没问题。你在循环控制的地方增加了++len,我认为这更好。你不会忘记它在循环体末尾的某处。当你使用continue时,它甚至可以工作。

2

那么,for循环是唯一一个接受这种语法的应用程序,所以这就是我所说的你应该使用的。除此之外......其实丝毫不重要。做什么很容易阅读。

1

真的没关系。就效率而言,它们是等效的。你可以做以下任一操作:

for(; s[len] != '\n'; len++) { ... } 

while(s[len] != '\n') { ... len++; } 

for循环也许是在这种情况下更容易阅读和while或许更聪明一点,但他们真的功能上等同。

编辑:确实,for不增加计数器,直到第一个循环之后。修复。

+0

不正确。 for循环不会在第一遍中运行增量指令,但while循环将会执行。 – 2010-12-10 22:40:37

+0

'while'不能按预期工作,因为'len'变量在循环体的'return'语句中使用之前会增加。 – 2010-12-10 22:40:46

1

我会用一段时间,把len递增的条件验证s[++len] != '\n'内:d 但我想这是你喜欢什么味道真的:)

+3

这会导致不同的行为。 – 2010-12-10 22:43:40

+0

应该用len ++吗? – lm2s 2010-12-11 00:36:16

1

个人而言,我这个去:

int len = 0; 
for (; s[len] != '\n'; ++len) { 
    // some processing 

    if (someCondition) { 
     break; 
    } 
} 

// if done iterating, return len 
return len; 

不过说真的,这一切都下降到可读性,因为有forwhile环路之间没有真正的语义差别。使用您认为最能表达代码含义的任何格式。在上面的案例中,我选择for,因为len循环变量,如果那不是,我会用while去。

+0

这是错的。 'len'具有for循环本身的范围,并且不能在for循环之外的任何地方访问。 – 2010-12-10 22:41:58

+0

你仍然需要在'for'声明之外声明'len'。 – birryree 2010-12-10 22:42:53

+0

啊,是的,我过去10点为我浏览SO。更正,谢谢。 – suszterpatt 2010-12-10 22:47:44

1

您正在迭代,并且for循环更加紧凑。无论如何,无论在哪种情况下都可以达到同样的效果,但为此,我更喜欢使用for,因为您在开始时都具有所有循环驱动程序(条件,计数器增加)。

int len = 0; 
while (s[len] != '\n') 
{ 
    // do stuff 
    if (something) return len; 

    ++len; 
} 
return len; 

int len; 
for (len = 0; s[len] != '\n'; ++len) 
{ 
    // do stuff 
    if (something) return len; 
} 
return len; 
2

鉴于你引用的代码,我会使用一个for循环,但我会把初始化for语句赋值:

int len; // <== Not here 

for (len = 0; s[len] != '\n'; ++len) { // <== Here 
    // some processing 

    if (someCondition) { 
     return len; 
    } 
} 

这是究竟是什么for结构适用于:初始化,测试和增量。

1

这是一个味道的问题。两者都是相同的。

但随着多年的发展,我真的更喜欢while循环for循环。我更喜欢线条短的时候,而且for有一个倾向于在同一行放置3个不同的步骤。

int i=0; 
while(s[i] != '\n') 
{ 
    // some processing 

    if (someCondition) 
    { 
     return i; 
    } 
    ++i; 
} 

但正如我所说,这是一个品味问题。

1

foreach!

int len = 0; 
for each (char& c : s) { 
    // some processing 
    if (someCondition || c=='\n') break; 
    len++; 
} 

// if done iterating, return len 
return len; 
+1

我认为在c + + 0x的语法是(char&c:s) – user534498 2010-12-11 01:50:24

+0

感谢您的更正:) – 2010-12-11 21:36:58

1

我看到大部分帖子都使用for

这个帖子在这里会给你想法,如果你想追求与while

#include <stdio.h> 

main() 
{ 
    int counter=0; 
    while(somecondition) { 
     if (s[counter]!='\n') 
     { 
     //some processing  
     } 
    ++counter; 
    } 
} 
return len; 
相关问题