C中有三个循环:for
,while
,和do-while
。他们之间有什么区别?
发布于 2018-05-02 14:42:03
一个while循环总是首先评估条件。
while (condition) {
//gets executed after condition is checked
}
甲DO / while循环将总是在执行代码do{}
块,然后再评估条件。
do {
//gets executed at least once
} while (condition);
一个for循环允许你启动一个计数器变量,检查条件和方式来增加您的柜台都在一行。
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
在一天结束时,它们仍然是循环的,但是它们在执行方式方面提供了一些灵活性。
For循环特别好,因为它们简洁。为了这个for循环
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
要写成一个while循环,你必须做下面的事情。
int count = 0;
while (count < 100) {
//do stuff
count++;
}
break会立即终止当前循环,不再执行迭代。
//will only run "do stuff" twice
for (int x = 0; x < 100; x++) {
if (x == 2) {
break;
}
//do stuff
}
continue将终止当前迭代并继续下一个迭代。
//will run "do stuff" until x >= 100 except for when x = 2
for (int x = 0; x < 100; x++) {
if (x == 2) {
continue;
}
//do stuff
}
请注意,在for循环中,'continue'会评估'for(part1; part2; part3)'的'part3'表达式; 相反,在while循环中,它只是跳转来重新评估循环条件。
发布于 2018-05-02 15:36:13
如果对速度和性能有强烈的关注,最好的方法是在程序集级别验证编译器生成的代码。
例如,下面的代码显示“同时执行”的速度要快一些。这是因为“JMP”指令没有被“do-while”循环使用。
顺便说一句,在这个具体的例子中,最坏的情况是由“for”循环给出的。:)
int main(int argc, char* argv[])
{
int i;
char x[100];
// "FOR" LOOP:
for (i=0; i<100; i++ )
{
x[i] = 0;
}
// "WHILE" LOOP:
i = 0;
while (i<100 )
{
x[i++] = 0;
}
// "DO-WHILE" LOOP:
i = 0;
do
{
x[i++] = 0;
}
while (i<100);
return 0;
}
//“for”循环:
010013C8 mov dword ptr [ebp-0Ch],0
010013CF jmp wmain+3Ah (10013DAh)
for (i=0; i<100; i++ )
{
x[i] = 0;
010013D1 mov eax,dword ptr [ebp-0Ch] <<< UPDATE i
010013D4 add eax,1
010013D7 mov dword ptr [ebp-0Ch],eax
010013DA cmp dword ptr [ebp-0Ch],64h <<< TEST
010013DE jge wmain+4Ah (10013EAh) <<< COND JUMP
010013E0 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
010013E3 mov byte ptr [ebp+eax-78h],0
010013E8 jmp wmain+31h (10013D1h) <<< UNCOND JUMP
}
//同时循环:
i = 0;
010013EA mov dword ptr [ebp-0Ch],0
while (i<100 )
{
x[i++] = 0;
010013F1 cmp dword ptr [ebp-0Ch],64h <<< TEST
010013F5 jge wmain+6Ah (100140Ah) <<< COND JUMP
010013F7 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
010013FA mov byte ptr [ebp+eax-78h],0
010013FF mov ecx,dword ptr [ebp-0Ch] <<< UPDATE i
01001402 add ecx,1
01001405 mov dword ptr [ebp-0Ch],ecx
01001408 jmp wmain+51h (10013F1h) <<< UNCOND JUMP
}
//“同时执行”循环:
i = 0;
. 0100140A mov dword ptr [ebp-0Ch],0
do
{
x[i++] = 0;
01001411 mov eax,dword ptr [ebp-0Ch] <<< DO THE JOB..
01001414 mov byte ptr [ebp+eax-78h],0
01001419 mov ecx,dword ptr [ebp-0Ch] <<< UPDATE i
0100141C add ecx,1
0100141F mov dword ptr [ebp-0Ch],ecx
01001422 cmp dword ptr [ebp-0Ch],64h <<< TEST
01001426 jl wmain+71h (1001411h) <<< COND JUMP
}
while (i<100);
https://stackoverflow.com/questions/-100004002
复制相似问题