有三个环在C: ,for
,while
和do-while
。它们之间有什么区别?
例如,似乎几乎所有while
语句都可以被for
语句替换,对吗?那么,使用的好处是什么while
?
有三个环在C: ,for
,while
和do-while
。它们之间有什么区别?
例如,似乎几乎所有while
语句都可以被for
语句替换,对吗?那么,使用的好处是什么while
?
loop
指令(减法,比较和单指令跳转)的编译器比编译while
成该loop
指令的编译器难吗?当前的编译器完全可以编译for
成loop
指令吗?
Answers:
一个while循环总是首先评估条件。
while (condition) {
//gets executed after condition is checked
}
甲做/ while循环会一直执行在代码do{}
块,然后再评估条件。
do {
//gets executed at least once
} while (condition);
一个for循环允许你启动一个计数器变量,检查条件和方式来增加您的柜台都在一行。
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
归根结底,它们仍然是循环,但是它们在执行方式方面提供了一定的灵活性。
这是对使用每种不同类型的循环背后的原因的很好的解释,这可能有助于清除问题。由于clyfe
for
和之间的主要区别在于while
语用上的问题:我们通常for
在已知迭代次数while
时使用,而在事先不知道迭代次数时使用构造。该while
VSdo ... while
问题也是语用学,第二执行一次在启动的指令,之后它的行为就像简单的一段时间。
for循环特别简洁,因为它们非常简洁。为了这个for循环:
for (int x = 0; x < 100; x++) {
//executed until x >= 100
}
要编写为while循环,您必须执行以下操作:
int count = 0;
while (count < 100) {
//do stuff
count++;
}
在这种情况下,还有更多的东西要跟上,这count++;
可能会在逻辑上迷失方向。最终可能会很麻烦,具体取决于在哪里count
递增,以及是否应该在循环逻辑之前或之后递增。使用for
循环时,计数器变量始终在循环的下一次迭代之前增加,这会增加代码的一致性。
为了完整起见,在这里讨论break
和continue
语句可能很有意义,这些语句在执行循环处理时会派上用场。
break将立即终止当前循环,并且不再执行任何迭代。
//will only run "do stuff" twice
for (int x = 0; x < 100; x++) {
if (x == 2) {
break;
}
//do stuff
}
继续将终止当前迭代并继续进行下一个迭代。
//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
计算;的part3
表达式for (part1; part2; part3)
。相反,在while循环中,它只是跳转以重新评估循环条件。
for's
和之间的主要区别在于while's
语用上的问题:通常for
在已知迭代次数的情况下使用,而在事先不知道迭代次数的情况下使用while
构造。该VS问题也是语用学,第二执行指令一旦在启动,之后它的行为就像简单。while
do ... while
while
如果强烈关注速度和性能,最好的方法是在汇编级别验证编译器生成的代码。
例如,以下代码显示“ do-while”要快一些。这是因为“ do-while”循环未使用“ jmp”指令。
顺便说一句,在此特定示例中,最糟糕的情况由“ 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
}
//“ WHILE”循环:
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
}
//“ DO-WHILE”循环:
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);
为了可读性
它们都是可以互换的。您可以选择一种类型,而永远只使用一种类型,但是通常对于给定任务而言,一种类型更方便。就像说“为什么要切换,您只能使用一堆if语句”一样-的确如此,但是如果它是一种常见的模式来检查变量的一组值,那么它具有语言功能,并且很容易阅读要做到这一点
do {if(!cond) break; /* do stuff */ } while(cond);
。丑陋且重复,但这是我关于为何存在差异的观点:)
/* do stuff */
如果cond
为假,它不会运行零件
如果您希望在条件为真时执行循环,而不是进行一定数量的迭代,那么让其他人更容易理解:
while (cond_true)
比这样的事情:
for (; cond_true ; )
请记住,for
循环本质上是花式while
循环。他们是同一回事。
while <some condition is true> {
// do some stuff
// possibly do something to change the condition
}
for ( some var, <some condition is true>; increment var ) {
}
for循环的优点在于,意外地进行无限循环比较困难。或者更确切地说,当您执行一个操作时更明显,因为通常将循环变量放在初始语句中。
一个while
循环更加清晰,当你没有做一个标准的递增模式。例如:
int x = 1;
while( x != 10 ) {
if ( some condition )
x = 10;
else
x += 5;
}
for
循环可能是为了方便和有效的方法而引入的。
我见过的while
/for
循环的一个常见误解是它们的效率不同。While
循环和for
循环同样有效。我记得我的一位高中计算机老师告诉我,当您必须增加一个数字时,for循环对于迭代更有效。事实并非如此。
For
循环只是语法上加糖的 while
循环,使迭代代码的编写速度更快。
当编译器获取您的代码并对其进行编译时,它会将其转换为计算机更容易理解并在较低级别(汇编)上执行的形式。在此翻译过程中,while
和for
语法之间的细微差别将丢失,并且它们变得完全相同。
for (i = 0 i < limit ; i++)
我前段时间注意到,For循环通常比while循环生成更多的机器指令。但是,如果您仔细查看反映我的观察结果的示例,则区别在于两到三个机器指令,几乎没有值得考虑的地方。
还要注意,可以通过将WHILE循环烘焙到代码中来消除其初始化程序,例如:
static int intStartWith = 100;
静态修改器将初始值烘焙到代码中,从而保存(鼓乐曲)一条MOV指令。更重要的是,将变量标记为静态将其移出堆栈框架。变量对齐允许的话,它也可能产生稍小的代码,因为MOV指令及其操作数比例如整数,布尔值或字符值(ANSI或Unicode)占用更多的空间。
但是,如果变量在8个字节的边界上对齐,则通用默认设置,代码中的int,bool或TCHAR都将与MOV指令占用相同的字节数。
的一个特殊之处do while
是,您需要等待一会儿才能使用分号。它通常用于宏定义中,以一次执行多个语句,同时限制宏的影响。如果将宏定义为块,则可能会发生某些解析错误。
do-while
存在
do-while
,它只是被使用,因为它碰巧创建了一个块并且最后仍然需要用分号
虽然更灵活。在适用的情况下,FOR更简洁。
FOR非常适合具有某种计数器的循环,例如
for (int n=0; n<max; ++n)
当然,正如其他人指出的那样,您可以使用WHILE完成相同的事情,但是现在初始化,测试和增量已经跨越了三行。如果循环的主体较大,则可能会出现三行分开的行。这使读者更难了解自己在做什么。毕竟,尽管“ ++ n”是FOR中非常常见的第三部分,但肯定不是唯一的可能性。我编写了很多循环,在其中编写了“ n + = increment”或更复杂的表达式。
当然,FOR也可以与计数器以外的其他设备配合使用。喜欢
for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())
等等。
但是当“下一次循环”逻辑变得更加复杂时,FOR崩溃了。考虑:
initializeList();
while (listHasMoreElements())
{
n=getCurrentElement();
int status=processElement(n);
if (status>0)
{
skipElements(status);
advanceElementPointer();
}
else
{
n=-status;
findElement(n);
}
}
也就是说,如果根据处理过程中遇到的条件,前进的过程可能不同,则FOR语句是不切实际的。是的,有时您可以使它使用足够复杂的表达式,使用三元?:运算符等来工作,但这通常会使代码的可读性降低,而不是更具可读性。
在实践中,我的大多数循环都是逐步遍历某种数组或某种结构,在这种情况下,我将使用FOR循环。或者正在从数据库中读取文件或结果集,在这种情况下,我使用WHILE循环(“ while(!eof())”或类似的东西)。
while
和for
语句都可以用于编程中的循环。是否使用while
循环还是取决于for
循环。有些使用while
循环很舒服,有些使用for
循环。
使用任何您喜欢的循环。但是,do...while
在C编程中,循环可能有些棘手。
/ * while循环
5块钱
1巧克力= 1块钱
while my money is greater than 1 bucks
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1
end
回家,不能去商店,因为我的钱= 0美元* /
#include<stdio.h>
int main(){
int money = 5;
while( money >= 1){
printf("inside the shopk and selecting chocolate\n");
printf("after selecting chocolate paying 1 bucks\n");
money = money - 1 ;
printf("my remaining moeny = %d\n", money);
printf("\n\n");
}
printf("dont have money cant go inside the shop, money = %d", money);
return 0;
}
无限金钱
while( codition ){ // condition will always true ....infinite loop
statement(s)
}
请访问此视频以更好地了解 https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s
/ * for循环
5块钱
for my money is greater than equal to 1 bucks 0 money >= 1
select chocolate
pay 1 bucks to the shopkeeper
money = money - 1 1-1 => 0
end
* /
#include<stdio.h>
int main(){
int money = 5;
for( ; money >= 1; ){ 0>=1 false
printf("select chocolate \n");
printf("paying 1 bucks to the shopkeeper\n");
money = money - 1; 1-1 = 0
printf(" remaining money =%d\n", money);
printf("\n\n");
}
return 0;
}
为了更好地理解,请访问https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s
GOTO
循环。尽管人们不认为它是一个循环,但我相信所有循环本质上都可以编译为条件GOTO循环。