循环
一、while
1、语法结构:
while(条件表达式)
{
语句;
}
2、示例:
int main()
{
int i =0;
while (i<10)
{
i++;
printf("haha");
}
return 0;
}
3、while中的continue语句
在while循环语句中,continue用于跳过本次循环,也就是本次循环中continue后边的代码不会再执行,而是直接
跳转到while语句的判断部分。进行下一次循环的入口判断。
int main()
{
int i = 1;//循环变量初始化
while (i <= 10)//循环变量判断
{
if (i == 5)//当i循环到5时,执行if语句
{
continue;//执行完if语句跳过i==5这次循环,即后面的代码不再执行直接进入下一轮循环的判断部分
}
printf("%d\t ", i);
i++;//循环变量调整
}
printf("haha\n");
return 0;
}//本段代码将会出现死循环现象:即在i增加到5时执行continue,跳过了i++,i的值不再改变,持续进行continue跳过,从而进入死循环。
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)//当i循环到5时,执行if语句
{
i++;//避免死循环,对i进行修改。
continue;//执行完if语句跳过i=5这次循环
}
printf("%d\t ", i);
i++;
}
printf("haha\n");
return 0;
}//执行结果为:1 2 3 4 6 7 8 9 10 haha
4、while中的break语句
在while循环语句中,break用于跳出循环,停止后期的所有的循环,直接终止循环。 所以:while中的
break是用于永久终止循环的。然后执行循环后面的语句。
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)//当i循环到5时,执行if语句
break;//执行完if语句跳出本循环
printf("%d\t ", i);
i++;
}
printf("haha\n");//跳到此处继续向下执行
return 0;
}//执行结果为:1 2 3 4 haha
二、for
1、语法结构:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1 为初始化部分,用于初始化循环变量的。表达式2为条件判断部分,用于判断循环时候终止。表达式3为调整部分,用于循环条件的调整。
2、示例:
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)//第二次循环时,不再执行表达式1
{
printf("%d ", i);
}
return 0;
}
3、for语句中的continue语句
for循环与while循环中continue语句是有差异的,即无论是否跳过循环体,for循环中的循环变量都会调整,但while循环中可能会跳过循环变量的调整从而导致循环变量为定值陷入死循环。
int main()
{
for(int 1 = 0;i<=10;i++)
{
if (i == 5)
continue;//i==5时跳过循环体,但无法跳过循环变量的调整(无法跳过i++),继续下一次循环
printf("%d\t ", i);
}
printf("haha\n");
return 0;
}
4、for语句中的break语句
与while循环一致:在for循环语句中,break用于跳出循环,就停止后期的所有的循环,直接终止循环。 所以:for循环中的break是用于永久终止循环的。然后执行循环后面的语句。
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
5、注意事项
5.1 在循环体内尽量不要修改循环变量,避免引起逻辑错误。
5.2 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
如:for(int i=0; i<10; i++) 遍历数组元素时,循环变量从0开始循环,刚好循环10次,循环界限常量为10。前闭区间,后开区间。
但若写成前闭后闭区间:for(int i=0; i<=9; i++) 遍历数组元素时,循环变量从0开始循环,循环10次,但循环界限常量为9。
5.3 for循环的省略
for循环中,循环变量的初始化、判断、调整都可以省略。for循环判断条件被省略时,循环判断恒为真。
#include <stdio.h>
int main()
{
//变种1
for(;;)//此时判断条件始终为真,则陷入无限循环
{
printf("hehe\n");
}
}
如果不是非常熟练,不要随便省略相关代码。
int main()
{
int i = 0;
int j = 0;
for (; i < 5; i++)
{
for (; j < 5; j++)
/*当外层循环循环1次后,j从0变成了5;当外层循环执行第二次循环时,由于内层循环变量的初始化被省略,故从j=5进入内层循环,不符合循环条件,内层循环不再执行,j的值也不再变化*/
{
printf("j = %d\t", j);
if ((j + 1) % 5 == 0)
printf("内层循环循环%d次!\t", j + 1);
}
printf("外层循环循环%d次!\n", i + 1);
}
return 0;
}
/*j = 0 j = 1 j = 2 j = 3 j = 4 内层循环循环5次! 外层循环循环1次!
外层循环循环2次!
外层循环循环3次!
外层循环循环4次!
外层循环循环5次!
D:\学习\计算机类\C\学习测试\Debug\学习测试.exe (进程 9636)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .*/
5.4 多循环变量的情况
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
//循环一次后i变为1,j变为1;循环两次i变为2,j变为2;第三次循环时不符合判断条件,循环终止
{
printf("hehe\n");
}
//循环两次,打印两次hehe
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
//循环0次,注意循环变量的判断部分是k = 0;是赋值符而不是相等符,判断部分恒为假,循环不执行
三、do while
1、语法结构:
do {
循环语句;
}while(表达式);
循环至少执行一次,使用的场景有限,所以不是经常使用。
2、示例
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);//第一次循环不用判断,直接执行
}while(i<10);
return 0;
}
3、do-while循环中的continue语句
与while循环类似,do-while循环中的continue语句的执行可能导致循环变量的调整语句被跳过,从而陷入死循环。
#include <stdio.h>
int main()
{
int i = 0;
do
{
if(5 == i)
continue;//i为5时跳过本次循环,也跳过了循环变量的调整,i将恒为5,陷入死循环
printf("%d\n", i);
i++;
}while(i<10);
return 0;
}
4、do-while循环中的break语句
与while循环类似,在do-while循环语句中,break用于跳出循环,停止后期的所有的循环,直接终止循环。
#include <stdio.h>
int main()
{
int i = 0;
do
{
if(5 == i)
break;//i为5时跳出循环,循环结束。
printf("%d\n", i);
i++;
}while(i<10);
return 0;
}
四、getchar实用循环程序
1、getchar();
基础知识:用户从键盘输入的东西在最初存储在键盘缓冲区,当 回车键(Enter) 到来时一起送往 输入缓冲区。注意,此时送往输入缓冲区的数据包括回车键Enter所代表的 ‘\n’。
例:从键盘上输入: “abcde”+回车键 最终送到输入缓冲区的字符为:abcde\n
函数作用:到输入缓冲区取一个字符(getchar可以读取‘ \n ’等各种字符)。如果输入缓冲区没有字符,则函数将等待键盘缓冲区向输入缓冲区发送字符,直到取到字符操作执行完成。
#include <stdio.h>
int main()
{
int get = 0;
char password[10] = {0};
printf("请输入密码:");
scanf("%s",&password);
//注意输入的字符串不能有空格符,制表符,换行符等空白符。
//scanf按%s格式从输入缓冲区读取数据时遇到换行符,空格,制表符等空白符则停止读取,即本次读取完毕。
//scanf只有在%c格式下能读取这些空白字符。
//因而,用户最后敲入的换行符'\n'则被留在输入缓冲区内。
printf("请确认(Y/N):");
//用户输入完毕后,用户发送到到输入缓冲区内字符为:用户输入的字符+'\n'
//但加上上次剩余的换行符,此时输入缓冲区内字符为:'\n'+用户输入的字符+'\n'
//第一个'\n'是上次scanf读剩下的,第二个'\n'是用户第二次输入完字符后敲入的回车键
get = getchar();
//getchar可以读取各种字符,包括输入缓冲区里的'\n',但单一个getchar语句只能读一个字符。
//故此时getchar从输入缓冲区读取字符,读到的字符为'\n'。
if(get == 'Y')
{
printf("确认成功\n");
}
else if(get == 'N')
{
printf("确认失败\n");
}
else//get == '\n',执行该语句
{
printf("输入错误\n");
}
return 0;
}
/*
请输入密码:1234qwer
请确认(Y/N):输入错误
D:\学习\计算机类\C\代码文件\test_4_9.exe (进程 228)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
*/
//显然上述代码并未达到相应的目的,为此,需对代码进行修改
……
printf("请输入密码:");
scanf("%s",&password);
getchar();//把输入缓冲区剩余的'\n'读取掉,保证用户第二次输入时输入缓冲区为空。
printf("请确认(Y/N):");
get = getchar();
/*但如果用户在输入完密码后多点了n个空白字符才按的回车键,尽管scanf在读取到空白字符时就停止了(读取的密码没问题)。但由于缓冲区剩余的字符为n个空白字符+换行符,上面的解决办法就不适用了。故做以下修改*/
printf("请输入密码:");
scanf("%s",&password);
while((ch = getchar()) != '\n')
{
;//什么也不执行,只需读取缓冲区字符即可。
}//清空输入缓冲区'\n'及其之前的所有字符,保证用户第二次输入时输入缓冲区为空。
printf("请确认(Y/N):");
get = getchar();
或者
……
printf("请输入密码:");
scanf("%s",&password);
fflush(stdin);//清空输入缓冲区,保证用户第二次输入时输入缓冲区为空。
printf("请确认(Y/N):");
get = getchar();
2、while ((ch = getchar()) != EOF)
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)//EOF为文件结束标志,ctrl+z,是一个转义字符
//当getchar()从输入缓冲区读取的字符不为EOF时,(ch = getchar()) != EOF将一直为真,循环持续执行。
{
putchar(ch);//循环体内容为,将getchar读取并赋给ch的字符输出。
}
return 0;
}//整段代码的作用是将getchar获取的字符逐个输出,直到获取到EOF,循环停止
//当然,循环体的内容可以改成其他语句,从而完成:在getchar读取到文件结束标志之前一直执行循环体的操作
3、while ((ch = getchar()) != EOF)与continue结合
#include <stdio.h>
int main()
{
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
{
getchar();
continue;//如果用户输入的字符不在'1'~'9'之间,则让用户持续输入
}
putchar(ch);//该语句可修改以完成特定需求,如:用作菜单选项功能
}
return 0;
}