0

可能重复:
为什么使用 for 循环而不是 while 循环?

我目前正在使用嵌入式 c。我使用的软件是keil uvision。

所以我有一个关于你将使用哪个循环的问题?两个循环都做同样的事情。只要信号 = 0,'i' 就会增加 1。

首先,

for(;signal==0;)
{
    i++;
}

下一个程序:

while(signal==0)
{
    i++;
}

那么你会使用哪个循环,为什么?他们俩有什么区别?它在执行时间方面有什么不同吗?还是纯粹基于您的喜好?

4

6 回答 6

6

一般来说,for当迭代次数已知时(即对于数组中的每个元素),循环是首选,而while当您不知道循环运行多少次时,循环更适合更一般的条件。但是,for循环可以做任何循环可以做的事情while,反之亦然;这完全取决于哪一个使您的代码更具可读性

在这种情况下,while循环会更可取,因为您正在等待signal == 0变为假,并且您不知道什么时候会发生。

于 2012-08-07T02:44:56.513 回答
3

任何for循环都可以用while循环编写,反之亦然。你所做的是偏好、约定和可读性的混合。

通常,for循环用于计数,while循环有点等待满足某个条件(如文件结尾)。没有性能差异。

样板forwhile循环:

for(int i = 0; i < someArraysLength; i++)
{
    // Modify contents of array
}

while(lineLeftInFile)
{
   // Read and parse the line
}
于 2012-08-07T02:43:01.423 回答
2

以最容易阅读和理解的为准。
请记住,其他人(除了您)可能会在某个时候尝试阅读您的代码。

我的意见:while

于 2012-08-07T02:38:18.323 回答
1

执行时间无关紧要。任何值得该死的编译器都会生成完全相同的代码。

现在,至于语义等......计算上,

for (init; test; increment) { /* do stuff */ }

完全等同于

init;
while (test) {
    /* do stuff */
    increment;
}

没有initand increment, 就变成了

while (test) {
    /* do stuff */
}

所以在计算上,两者是相同的。但是,从语义上讲,for循环适用于您一个设置和/或增量阶段(特别是如果它们进行可预测的迭代次数)。既然没有,那就坚持吧while

于 2012-08-07T02:48:05.400 回答
0

我同意 mariusnn 的观点,无论哪个最容易阅读,而且对while我来说似乎也更容易阅读。

查看 Visual Studio 2005 在进行调试构建时生成的汇编器,这两个循环的汇编器指令看起来是相同的。实际上,如果您使用 if 语句和标签执行相同的循环,其中 true 语句是递增 i 然后再次转到 if 语句,看起来这也会生成相同的汇编程序。

    for (; signal == 0; ) {
0041139C  cmp         dword ptr [signal],0 
004113A0  jne         wmain+3Dh (4113ADh) 
        i++;
004113A2  mov         eax,dword ptr [i] 
004113A5  add         eax,1 
004113A8  mov         dword ptr [i],eax 
    }
004113AB  jmp         wmain+2Ch (41139Ch) 

    while (signal == 0) {
004113AD  cmp         dword ptr [signal],0 
004113B1  jne         loop (4113BEh) 
        i++;
004113B3  mov         eax,dword ptr [i] 
004113B6  add         eax,1 
004113B9  mov         dword ptr [i],eax 
    }
004113BC  jmp         wmain+3Dh (4113ADh) 

loop: if (signal == 0) {
004113BE  cmp         dword ptr [signal],0 
004113C2  jne         loop+11h (4113CFh) 
        i++;
004113C4  mov         eax,dword ptr [i] 
004113C7  add         eax,1 
004113CA  mov         dword ptr [i],eax 
        goto loop;
004113CD  jmp         loop (4113BEh) 
      }
于 2012-08-07T03:00:00.220 回答
0

那么你会使用哪个循环,为什么?

如果必须在两者之间进行选择,我可能会使用while循环,它更简单、更清晰,并且它清楚地向其他开发人员传达了以下代码块将持续执行直到信号更新。

然后再一次可以这样做:for(; signal == 0; i++);它似乎更简洁,尽管那是假设这确实是生产代码。

由于溢出,所有这些方法仍然看起来有点危险,即使在嵌入式设备上,大多数时钟仍然非常快,并且可能很快就会达到底层数据类型的上限,然后我不知道这是否会生产我也不知道这是否是可接受的结果。

他们俩有什么区别?

for就像你说的那样,尽管我确信还有其他方法,如我所展示或其他人提到的那样,但两者都实现了相同的目标,和之间最大的区别while是,一个通常在我们知道迭代次数时使用,而另一个我们不知道,虽然无论好坏,我已经看到了for它非常灵活的一些非常独特的用途。

它在执行时间方面有什么不同吗?还是纯粹基于您的喜好?

至于性能,基本上由您的编译器决定如何解释它,它可能会或可能不会产生相同的二进制文件,因此执行时间,您可以要求它产生程序集或进行一些分析。

似乎 uvision 4 IDE http://www.keil.com/product/brochures/uv4.pdf确实支持反汇编,如第 94 页所述,以及如第 103 页所述的分析,如果这确实是您的版本使用。

虽然如果差异足够小,请不要为了增加几个纳秒而牺牲可读性,这只是我的意见,我相信还有其他人会不同意。

我能给你的最好建议是,尽你所能,编写清晰的代码,这意味着大多数人可以毫不费力地看到它传达的内容,这是高效且可维护的。

于 2012-08-07T04:56:26.153 回答