for
和while
语句之间有区别吗?它只是语法吗?
#include <stdio.h>
void main() {
int cent_temp = 0;
int fah_temp;
while (cent_temp <= 20) {
fah_temp = (9 * cent_temp) / 5 + 32;
printf("%d degrees C = %d degrees F\n", cent_temp, fah_temp);
cent_temp++;
}
}
这对我意味着......
虽然cent_temp
的值小于20
,但计算fah_temp
。然后按cent_temp
增加1
的值并检查它是否仍然小于20
;然后再次绕圈。
关于语法:
printf("%d degrees C = %d degrees F\n", cent_temp, fah_temp);
这意味着%d
表示打印到屏幕,用十进制数替换cent_temp
和%d
的值表示用小数字替换fah_temp
的值。
#include <stdio.h>
void main() {
int cent_temp;
int fah_temp;
for (cent_temp = 0; cent_temp <= 20; cent_temp++) {
fah_temp = (9 * cent_temp) / 5 + 32;
printf("%2d degrees C = %2d degrees F\n", cent_temp, fah_temp);
}
}
我对上述的解释是:
cent_temp
= 0
重复cent_temp
小于20
,然后在最后执行cent_temp+1
。因此cent_temp
0
进入循环计算fah_temp
并打印到屏幕上。然后cent_temp
上升一个然后再循环。在这里,我使用%2d
而不是%d
来表示它应该有一个十进制数的空格(并且它们在执行时排成一行)。如果cent_temp > 20
,则不会执行这两个代码。
同样,在do
while
循环中重新排列语句也会产生类似的效果,并且不会对结果产生任何影响。
每种类型的循环都有不同的应用程序吗?
如果我错了,请纠正我!
答案 0 :(得分:3)
'for'和'while'语句之间有区别吗?它只是 语法?
对我来说,这只是语法。
来自 K&amp; R部分3.5循环 - 而对于,我引用:
for
声明for (expr1; expr2; expr3) statement
相当于
expr1; while (expr2) { statement expr3; }
除了
continue
的行为。在语法上,
for
循环的三个组件是表达式。 最常见的是,expr1
和expr3
是分配或函数调用expr2
是一个关系表达式。
备注强>
正如用户@chqrlie在评论中提到的那样,break
和continue
之类的控制语句会使情况略显模糊。
在某些情况下,循环体中需要修改语句。例如Erase-remove idiom with std::set failing with constness-related error(在C ++中)
示例强>
作为一个例子,让我们编写一个循环来打印1到100之间的所有奇数。
int i = 1;
while (i <= 100) {
printf("%d\n", i);
i += 2;
}
for (int i = 1; i <= 100; i += 2) {
printf("%d\n", i);
}
<强>意见强>
我不是语言专家,但在实践中的大多数情况下,我发现它们是可转换的。
我个人更喜欢使用for
语法,因为:
for
标题),便于阅读,i
)不会暴露给外部范围。答案 1 :(得分:2)
for(cent_temp = 0; cent_temp <= 20; cent_temp++)
{ /* code */ }
100%相当于
cent_temp = 0;
while(cent_temp <= 20)
{
/* code */
cent_temp++;
}
但是do-while
是不同的,因为它将条件检查放在最后。
至于什么时候使用哪个循环,这是一个风格问题,因此有点主观。大多数C程序员使用的行业事实上的标准风格如下:
for
个循环。它被认为是最易读的形式。 while
循环,事先知道迭代次数,或者由于某种原因循环变得复杂。例如,如果您需要在循环体内更改循环迭代器变量,那么您应该使用while
循环而不是for
循环。do while
循环应该用于需要在循环的第一圈跳过条件检查的特殊情况,例如do { result = send(); } while(result == ok);
。答案 2 :(得分:2)
我查看了Steve McConnell的代码完整 (圣经)。
以下是您在第16章中可以阅读的内容:
当你需要一个执行指定次数的循环时,for循环是一个不错的选择。 [...]
对于不需要内部循环控件的简单活动,使用for循环。当循环涉及简单的增量或简单的减量时使用它们,例如迭代容器中的元素。 for循环的要点是你将它设置在循环的顶部然后忘掉它。你不必在循环内做任何事来控制它。如果你有一个执行必须跳出循环的条件,那就改用while循环。
同样,不要显式更改for循环的索引值以强制终止。请改用while循环。 for循环用于简单用途。最复杂的循环任务可以通过while循环更好地处理。
答案 3 :(得分:1)
通常,您将使用for
循环来迭代一组有限的值,而您将使用while
或do-while
循环来迭代特定条件或一套条件是真的。在大多数C的同时代人(Basic,Pascal,Fortran等)中,for
循环只能 迭代标量索引:
的Fortran:
DO 10 i=1,10
statements
10 CONTINUE
帕斯卡:
for i := 1 to 10 do
begin
statements
end;
这两个片段都恰好循环了10次。索引i
由循环自动初始化和更新。我必须回去检查,但我很确定你不能在循环体中写入i
。
C实际上通过添加控件表达式来模糊for
和while
循环之间的线:
for ( init-expr ; control-expr ; update-expr )
statement
在C中,for
循环可以像Fortran或Pascal一样遍历标量:
for( i = 0; i < 10; i++ )
{
do_something_with( i );
}
或者它可以迭代多个标量:
for ( i = 0, j = 0; i < 10 && j < 10; i++, j++ )
{
do_something_with( i, j );
}
或者它可以遍历文件的内容:
for( c = fgetc( in ); c != EOF; c = fgetc( in ) )
{
do_something_with( c );
}
或者它可以迭代链表:
for( cur = head; cur != NULL; cur = cur->next )
{
do_something_with( cur );
}
在Fortran和Pascal中,最后三个循环必须表示为while
循环(我不会这样做,因为我已经非常耗尽了我的Fortran和Pascal知识)。
C for
循环与Fortran或Pascal循环之间的另一个重要区别是,您可以写入循环索引(i
,j
,c
,或循环体中的cur
);它没有受到任何特别的保护。
只要特定条件或条件集合为真,就会使用while
或do-while
循环进行迭代:
while( control-expr )
statement
do
statement
while( control-expr );
在for
和while
循环中,条件在循环体执行之前进行测试;在do-while
循环中,在循环体执行之后测试条件,因此do-while
循环将始终至少执行一次。
在C中,您可以在许多情况下使用for
循环或while
循环:
while ( ( c = fgetc( in ) ) != EOF )
do_something_with( c );
for ( c = fgetc( in ); c != EOF; c = fgetc( in ) )
do_something_with( c );
两个循环完全相同;只是你认为哪一个更明确地表达了你的意图,或者你认为其他人更容易理解的问题。
答案 4 :(得分:0)
从算法的角度来看,虽然不一样。简而言之,在算法中,应该在已知边界时使用,而在您不知道条件是否可以满足时或何时可以使用时使用。因为是重复n次(已知),这正是你的例子计算的情况;应该使用for循环(你不觉得循环在for循环中更明确地说明了什么吗?)。如果你想要一个必须在循环中使用的例子,看看像Collatz序列这样的东西。从可计算性的角度来看,for循环总是可以在while循环中转换而不是相反的转换。
从计算机语言的角度来看,现在通常将两者融合,例如,在C语言中,它没有区别,只有语法。但请记住,在其他一些可能非常不同的语言中,例如在Pascal for循环中非常有限。
答案 5 :(得分:0)
源代码不仅可以由计算机编译和执行,还可以被人类阅读和理解。
计算机并不介意使用for
循环,while
循环还是goto
。另一方面,人类期望不同结构的不同含义。
for
循环显示; while
循环显示文件到最后。选择使用哪种结构与选择变量名称类似。