3.2 for循环
3.2.1 语法
与while循环相比,for循环的优点是什么呢?
#include<stdio.h>
int main()
{
int i = 0;//初始化部分
while (i<=10)//表示条件判断部分
{
printf("%d", i);
i++;//调整部分
}
return 0;
}
这个是while循环中的打印1到10的数字代码
int main()
{
int i = 0;
for (i = 0;i <= 10;i++)//分别是初始化部分 条件判断部分 调整部分
{
printf("%d", i);
}
return 0;
}
而这个是使用for循环打印出1到10的数字的代码。while循环中的三个必要循环条件由于代码风格使得距离较远,而for循环中的循环的三个必要条件足够集中,方便以后进行修改和思考,因此for循环更具有语法优势。
3.2.2 break和continue在for循环中的用法
int main()
{
int i = 0;
for (i = 0;i < 10;i++)
{
if (5 == i)
break; //break的作用是跳出本次循环
printf("%d", i);//只能打印出0 1 2 3 4
}
return 0;
}
int main()
{
int i = 0;
for (i = 0;i < 10;i++)
{
if (5 == i)
continue; //continue的作用是跳出本次循环
printf("%d", i);//只能打印出0 1 2 3 4 5 6 7 8 9
}
return 0;
}
tip:其中(i==5)写成(5==i)是因为如果当你少写了一个等号时,(i=5)仍然会进行下去,它表达的是将5赋值给i,而写成(5=i)时,其中5是常量,不可以被改变,此时就会出现错误,所以写成第二种形式时可以避免错误的发生。
下面是错误写法:
int main()
{
int i = 0;
for (i = 0;i < 10;i++)
{
if (i=5)
continue;
printf("%d", i);
}
return 0;
}
它表达的是将5赋值给i,判断为真,一进入循环体内就会一直执行continue,一直跳出本次循环,所以什么都不输出。
3.2.3for语句的循环控制变量
建议:1.不可以在循环体内修改循环变量,防止循环体失去控制
int main()
{
int i = 0;
for (i = 0;i <= 10;i++)
{
i = 5;
printf("%d", i);
}
return 0;
}
它表示的是一直输出6,进入死循环,不能输出1到10的数字
2.for语句的循环控制变量的取值采取“前闭后开区间”写法
int i = 0;
for (i = 0;i < 10;i++);
//前闭后开的写法
int i = 0;
for (i = 0;i <= 9;i++);
//前闭后闭的写法
//都是循环十次,而第一次可以更直接的看出循环了十次
3.24 一些for循环的变种
int main()
{
for (;;)
{
printf("hehe");
}
return 0;
}
这里的初始化和调整部分省略时,表示什么都不干,当省略判断部分时,表示恒为真,就会一直进行循环,相当于死循环。
int main()
{
int i = 0;
int j = 0;
int n=0;
for (i=0;i < 10;i++)
{
for (j=0;j < 10;j++)
{
printf("hehe");
n++;
}
} //该代码可以打印100个hehe
printf("%d", n);
return 0;
}
int main()
{
int i = 0;
int j = 0;
int n = 0;
for (;i < 10;i++)
{
for (;j < 10;j++)
{
printf("hehe");
n++;
}
}
printf("%d", n);
return 0;
}
如果去掉初始化的部分,这里可以打印10个hehe。
我们可以看一下这个代码是怎么运行的?当进入内层循环时,j一直循环到成为10之后,重新从外层循环进入时,j=10,所以不满足内层循环的条件,不会进入内层循环,因此只打印出10个hehe。
int main()
{
int x, y;
for (x = 0, y = 0;x < 2 && y < 5;x++, y++)
{
printf("hehe\n");
}
return 0;
}
该代码中使用多个变量控制循环,对循环没有影响。
这里有一道题请判断一下循环要循环多少次?
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0;k = 0;i++, k++)
k++;
//printf("%d", k);
return 0;
}
由于判断部分将0赋值给k,表示假,所以不会进入循环,循环次数为零。
3.3 do...while()循环
3.3.1 do语句的语法
do
{
循环语句;
}
while(表达式);
特点:循环至少执行一次,使用的场景有限,所以不经常使用。
int main()
{
int i = 1;
do
{
printf("%d\n", i);
i++;
} while (i < =100);
return 0;
}
该代码可以打印出1到100之间的数字
3.3.4 do...while循环中的continue和break
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d\n", i);
i++;
} while (i <= 10);
return 0;
}
该代码只可以打印出1,2,3,4,当i等于5时,每一次循环都会判断i是否等于5,等于5时就会跳过本次循环,每次循环时都为5,所以只能打印出1,2,3,4,进入死循环,重复此过程。
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d\n", i);
i++;
} while (i <= 10);
return 0;
}
break的作用是结束循环,当遇到i等于5时就会结束,因此只可以打印出1,2,3,4。
4.goto语句
goto语句的作用是一次性跳出一层或多层循环。只使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。以下是goto语句真正适合的场景
for{
for{
for{
if (diaster)
goto error;
}
}
}
error:
if(diaster)
//处理错误情况
下面是使用goto语句的一个例子,然后使用循环的方式实现替换goto语句:
一个关机程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
again:
printf("电脑将在60秒后关机,如果输入:我是猪,将取消关机!\n请输入:>");
scanf_s("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("system -a"); //取消关机
}
else
{
goto again;
}
return 0;
}
如果不适用goto语句,则可以使用循环:
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
again:
printf("电脑将在60秒后关机,如果输入:我是猪,将取消关机!\n请输入:>");
scanf_s("%s", input);
while (1)
{
if (0 == strcmp(input, "我是猪"))
{
system("system -a"); //取消关机
break;
}
}
return 0;
}