在某些情况下,我们可以使用 while 循环或 do-while 循环互换。 我的一位朋友告诉我,我们应该使用 do-while 循环。 因为它比更快。 谁能给我证明呢?
答案 0 :(得分:6)
你正在比较苹果和桃子。
do-while
和while
循环与它们提供的功能不同
do-while
始终执行一次,while
仅在条件为真时执行。
在您可以使用的情况下,没有性能差异 如果您有疑问,那么在您的平台上自行分析它或分析两者的汇编输出就是您应该做的。
答案 1 :(得分:6)
两个循环几乎相同(除了do-while至少执行一次这一事实),并且在许多情况下编译为相同的指令,至少在x86上。
以下代码:
int main(int argv, char *argc[]) {
int a = 0;
while (a < 100) {
a++;
}
a = 0;
do {
a++;
}while(a < 100);
return 0;
}
生成此程序集(使用gcc -S -o temp.as temp.c
):
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call ___main
movl $0, 12(%esp) >> while
jmp L2
L3:
addl $1, 12(%esp)
L2:
cmpl $99, 12(%esp)
jle L3
movl $0, 12(%esp) >> do-while
L4:
addl $1, 12(%esp)
cmpl $99, 12(%esp)
jle L4
movl $0, %eax
leave
ret
答案 2 :(得分:2)
没有。 C标准没有提供执行速度的要求,因此一般无法证明。
答案 3 :(得分:2)
while和do-while之间的区别在于do-while总是第一次执行,而不检查条件。所以假设第一次条件实际为真,do-while保存了一个条件的检查。
这是一种微观优化。
答案 4 :(得分:1)
如果你不关心不同的语义(至少一次也许没有),没有区别。
答案 5 :(得分:1)
C语义描述了抽象机器的行为,其中优化问题是无关紧要的。 (见C99标准,5.1.2.3p1)
答案 6 :(得分:1)
如果是编译器可以很好地优化它的情况,请坚持使用while
循环。回路测试更清晰。原因在于形式验证。 while
循环测试正确执行正文的前提条件。 do
循环执行一次主体而不测试任何东西,然后必须处理后果,可以这么说。推理起来比较棘手。我们必须考虑由于循环之前存在的条件加上第一次迭代的无人看守执行的影响而导致的情况。
如果你有一个昂贵的循环保护(比如调用一些可以进行I / O的外部函数或谁知道还有什么),那么考虑将其移动,如果可能的话。