仅使用停止条件时,使用“for”或“while”循环?

时间:2012-08-07 02:36:07

标签: c for-loop embedded while-loop

  

可能重复:
  Why use a for loop instead of a while loop?

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

所以我对你将使用哪个循环有疑问? 两个循环完全相同。只要signal = 0,'i'将增加1。

首先,

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

下一个节目:

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

那么你会使用哪个循环?为什么?它们之间有什么区别? 执行时间是否有任何差异?或者它纯粹基于您的偏好?

6 个答案:

答案 0 :(得分:6)

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

在这种情况下,while循环会更好,因为您正在等待signal == 0变为假,而您不知道何时会发生这种情况。

答案 1 :(得分:3)

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

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

Boilerplate forwhile循环:

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

while(lineLeftInFile)
{
   // Read and parse the line
}

答案 2 :(得分:2)

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

我的意见:while

答案 3 :(得分:1)

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

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

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

完全等同于

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

如果没有initincrement,则变为

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

在计算上,两者是相同。但是,在语义上,当{em>具有设置和/或增量阶段时(特别是如果它们产生可预测的迭代次数),for循环就是用于此。既然你没有,坚持while

答案 4 :(得分:0)

我同意mariusnn,无论哪个最容易阅读,while似乎也更容易给我读。

在进行Debug构建时,查看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) 
      }

答案 5 :(得分:0)

  

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

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

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

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

  

两者有什么区别?

就像你说的那样都达到了同样的目标虽然我确定有其他方式,如我所示或其他人提到的,forwhile之间的最大区别在于我们通常会使用知道数字迭代,而另一个我们不知道,但无论好坏,我已经看到for的一些非常独特的用途,它非常灵活。

  

执行时间是否有任何差异?或者它纯粹基于您的偏好?

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

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

虽然如果差异足够小,请不要仅仅为了挤压几纳秒来牺牲可读性,这只是我的意见,我相信其他人会不同意。

我能给你的最好的建议就是尽可能地尽力编写清晰的代码,这意味着大多数人都可以毫不费力地看到它传达的东西,这是有效和可维护的。