对于在C编程中的VS?
C中有三个循环: while
和do-while
。 他们之间有什么区别?
例如,几乎所有的语句都可以被语句replace,对吗? 那么,有什么优势使用?
while循环将始终首先评估条件。
while (condition) { //gets executed after condition is checked }
do / while循环将总是首先执行do{}
块中的代码,然后评估条件。
do { //gets executed at least once } while (condition);
一个for循环允许你启动一个计数器variables,一个检查条件和一个方法来增加你的计数器在一行。
for (int x = 0; x < 100; x++) { //executed until x >= 100 }
在这一天结束的时候,他们仍然是循环的,但是他们提供了一些灵活的方式来执行。
下面是使用每种不同types的循环的原因的一个很好的解释,可能有助于澄清事情。 谢谢clyfe
for
和while
之间的主要区别是一个语用问题:我们通常for
存在已知次数的迭代时,并且while
构造迭代次数不足时使用。while
do ... while
同样的do ... 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
循环,您的计数器variables始终会在循环的下一次迭代之前递增,这会增加代码的一致性。
为了完整起见,讨论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”会评估“for(part1; part2; part3)”的'part3'expression式。 相反,在while循环中,它只是跳转来重新评估循环条件。
如果对速度和性能有强烈的关注,最好的方法是在汇编级validation编译器生成的代码。
例如,下面的代码显示“do-while”有点快。 这是因为“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”LOOP:
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”LOOP:
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”LOOP:
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);
为了可读性
它们都是可以互换的。 你可以select一个types,除了那个之外什么也不用,但是通常对于一个给定的任务来说更方便。 这就像是说“为什么要切换,你可以使用一堆if语句” – 是真的,但如果检查一个variables是一个常见的模式,如果有一个语言特性要做到这一点
请记住, for
循环本质上是一个幻想循环。 他们是一样的东西。
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循环的优点是不小心做了一个无限循环。 或者说,当你做一个更明显,因为你通常把循环var放在初始语句。
while
循环更清晰,当你没有做一个标准的增量模式。 例如:
int x = 1; while( x != 10 ) { if ( some condition ) x = 10; else x += 5; }
如果您希望在条件为真时执行循环,而不是在某个迭代次数内执行循环,则其他人可以更容易理解:
while (cond_true)
比这样的东西:
for (; cond_true ; )
你应该使用这样一个循环,最完全符合你的需求。 例如:
for(int i = 0; i < 10; i++) { print(i); } //or int i = 0; while(i < 10) { print(i); i++; }
显然,在这种情况下,“为”比“时”更好看。 在某些操作必须在您的循环条件被检查的时刻之前已经完成的时候,应该使用“do while while”。
对不起,我的英语不好)。
A for
在该scheme上使用索引或变体for
build议固定的迭代。
有while
, do... while
你有一个必须每次检查的条件时(除了一些类似索引的构造,参见上面),你使用的是构造。 它们在执行条件检查的第一次执行时有所不同。
你可以使用任何一个构造,但是根据你的使用情况,它们有其优点和缺点。
while
/ for
循环的一个常见的误解是他们的效率不同。 While
循环和for
循环同样高效 。 我记得我的高中电脑老师告诉我,当你不得不增加一个数字时,for循环对迭代更有效率。 事实并非如此。
For
循环For
循环中只是简单的语法加糖 ,并且可以更快地写入迭代代码。
当编译器接收你的代码并编译它时,它将把它翻译成一个更容易让计算机理解并在较低级别(汇编)上执行的forms。 在这个翻译过程中,句法和句法之间的细微差别被丢失了,它们也变得完全一样。
前一段时间我注意到For循环通常比while循环产生更多的机器指令。 但是,如果仔细观察反映我观察结果的例子,其差别是两三个机器指令,几乎不值得考虑。
请注意,WHILE循环的初始值设定项可以通过将其烧入代码中来消除,例如:
static int intStartWith = 100;
静态修饰符将初始值烘焙到代码中,从而保存(滚动滚动) 一条 MOV指令。 更重要的是,将一个variables标记为静态将其移动到堆栈框之外。 由于MOV指令及其操作数比例如整数,布尔值或字符值(ANSI或Unicode)占用更多的空间,因此可变alignment允许也可能产生稍小的代码。
但是,如果variables在8个字节边界上alignment,则烘焙成代码的公共默认设置,int,bool或TCHAR的成本与MOV指令的字节数相同。
他们所做的工作都是一样的。 你可以使用它们中的任何一个来做同样的事情。 但是为了可读性,可用性,便利性等,它们是不同的。
while和do-while之间的区别在于,在检查循环条件的情况下,如果这是真的,则执行主体并再次检查条件。 do-while检查身体执行后的情况,所以do-while至less执行一次body。
当然你可以写一个while循环作为do-while和vv,但是这通常需要一些代码重复。
do while
一个特点是,你需要一个分号后才能完成。 在macros定义中经常使用它来一次执行多个语句,同时限制macros的影响。 如果macros定义为块,则可能会出现一些parsing错误。
其中一个解释
For循环(至less考虑C99)优于While循环,因为它们限制增量variables的范围。
当条件依赖于某些input时while循环是有用的。 它们是三种循环types中最less使用的。
在while和while之间: while
不需要初始化也不update语句,所以可能看起来更好,更优雅; for
可以缺less语句,一两个或全部,所以如果在循环之前需要初始化,循环条件和“更新”,那么它是最灵活和最明显的。 如果你只需要循环条件(在循环开始时testing),那么更优雅。
在for / while和do-while之间 :在do-while
循环结束时评估条件。 如果循环必须至less执行一次,则更舒适。
WHILE更灵活。 在它适用的情况下,FOR更简洁。
FOR对于具有某种types的计数器的循环非常有用
for (int n=0; n<max; ++n)
当然,你可以用WHILE来完成同样的事情,正如其他人所指出的那样,但是现在初始化,testing和增量在三行中都被打破了。 如果回路的主体很大,则可能有三条分开的线路。 这使读者很难看到你在做什么。 毕竟,“++ n”是FOR中非常常见的第三块,当然不是唯一的可能性。 我写了很多循环,我写了“n + =增量”或更复杂的expression式。
当然,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语句是不切实际的。 是的,有时候你可以用一个复杂的expression式,使用三元?:运算符等,但是这样做通常会使得代码更不可读,而不是更具可读性。
实际上,我的大部分循环都是通过某种数组或结构进行的,在这种情况下我使用了FOR循环; 或正在从数据库中读取文件或结果集,在这种情况下,我使用WHILE循环(“while(!eof())”或类似的东西)。
除了do-while
循环之外,它们几乎是一样的。 当你有一个counter
types的variables时, for
循环是很好的。 这很明显。 while
循环有意义的情况下,如下所示检查一个标志:
while (!done) { if (some condtion) done = true; }
/ * 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) }
请访问此video以便更好地了解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
我会补充一点,我认为在我之上的人没有说,而是for
做更多的记忆
while
和for
语句都可以用于循环编程。 它将取决于程序员是否使用while
循环或for
循环。 有些使用while
循环很舒服,有些使用for
循环。
使用任何你喜欢的循环。 然而, do...while
循环在C编程中可能有点棘手 。