我目前正在使用嵌入式c。我正在使用的软件是keil uvision。
所以我对你将使用哪个循环有疑问? 两个循环完全相同。只要signal = 0,'i'将增加1。
首先,
for(;signal==0;)
{
i++;
}
下一个节目:
while(signal==0)
{
i++;
}
那么你会使用哪个循环?为什么?它们之间有什么区别? 执行时间是否有任何差异?或者它纯粹基于您的偏好?
答案 0 :(得分:6)
一般来说,当已知迭代次数(即对于数组中的每个元素)时,for
循环是首选,而当您不知道时,while
循环对于更一般的条件更好你将运行循环多少次。但是,for
循环可以执行while
循环可以执行的任何操作,反之亦然;这一切都取决于哪一个使你的代码更具可读性
在这种情况下,while
循环会更好,因为您正在等待signal == 0
变为假,而您不知道何时会发生这种情况。
答案 1 :(得分:3)
任何for
循环都可以使用while
循环编写,反之亦然。你所做的是偏好,惯例和可读性的混合。
通常,for
循环用于计数,而while
循环则等待满足某个条件(如文件末尾)。没有性能差异。
Boilerplate for
和while
循环:
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;
}
如果没有init
和increment
,则变为
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++);
它似乎更简洁,但是假设这确实是生产代码。
由于溢出,所有这些方法似乎都有点危险,即使在嵌入式设备上,大多数时钟仍然非常快,并且可能很快就会达到基础数据类型的上限,然后我再也不知道是否这样将是生产代码,我也不知道这是否是可接受的结果。
两者有什么区别?
就像你说的那样都达到了同样的目标虽然我确定有其他方式,如我所示或其他人提到的,for
和while
之间的最大区别在于我们通常会使用知道数字迭代,而另一个我们不知道,但无论好坏,我已经看到for
的一些非常独特的用途,它非常灵活。
执行时间是否有任何差异?或者它纯粹基于您的偏好?
至于性能,从根本上取决于你的编译器决定如何解释它,它可能会或可能不会产生相同的二进制文件,因此执行时间,你可以要求它生成程序集或进行一些分析。
似乎uvision 4 IDE http://www.keil.com/product/brochures/uv4.pdf确实支持反汇编,如第94页所述,以及如第103页所述的分析,如果确实是您正在使用的版本。
虽然如果差异足够小,请不要仅仅为了挤压几纳秒来牺牲可读性,这只是我的意见,我相信其他人会不同意。
我能给你的最好的建议就是尽可能地尽力编写清晰的代码,这意味着大多数人都可以毫不费力地看到它传达的东西,这是有效和可维护的。