循环语句(循环结构)+goto语句了解
一、while语句
1、语法结构
接下来,举一个输出数字1-5的例子简单了解一下:
#include<stdio.h>
int main()
{
int i = 1;
while(i<=5)
{
printf("%d ",i);
i++;
}
return 0;
}
2、while语句中的continue
对于 while 语句 continue 关键字会出现在循环体内部,它的作用是跳过 continue 语句之后的循环语句,转到 while 语句的条件判断部分进行下一次循环的判断。
由于 while 语句的循环调整部分在循环语句里,所以使用 continue 很容易让代码陷入死循环。
3、while语句中的break
对于 while 语句中出现的 break ,同样一般出现在循环体内部,作用是永久终止循环,即本次循环break之后的语句和以后的循环都不再执行,直接跳到 while 语句之后。
4、简单实例(输入字符为数字是打印)
这里简单提一下两个函数:
- int getchar( void );———不需要参数,从键盘获取一个字符,返回值为该字符的ASCII值
- int putchar( int c );————参数为需要打印的字符,从键盘打印一个字符,返回值为该字符的ASCII值
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF) //EOF:end of file,自定义终止符。
{
if (ch <'0' || ch >'9')
continue; //若不是数字就跳过这次循环
putchar(ch); //若是数字就打印
}
return 0;
}
’ EOF ’ 通常出现在文本的最后表示结束。值为-1,需要结束时按 ctrl+V 告诉系统已经到了’ EOF ’ ,此时系统就会结束while语句。
- - -小扩展
做一个确认名字的小程序,先看一段代码:
#include<stdio.h>
int main()
{
int ch = 0;
char name[20] = { 0 };
scanf("%s", name);
getchar(); //加上这个是为了防止后面的getchar()获取到scanf()后面的回车
printf("Please check it(Y/N):\n"); //进行确认
ch = getchar();
if (ch == 'Y')
printf("Success!\n");
else
printf("Defeat!\n");
return 0;
}
这里想要表达的是,scanf()确认输入完毕的机制就是识别一个回车,这时如果不对回车进行处理,那么确认的字符来不及输入就会被判断,回车 的ASCII值不等于 ’ Y ’ 的ASCII值,直接打印 " Defeat! " 程序结束。
所以在 scanf() 加上 getchar() 是为了防止后面确认的 getchar() 获取到scanf()后面的回车。
二、do while 语句
1、语法结构
先执行,后判断,循环体至少会执行一次。所以使用场景有限,不经常使用。
2、do while语句中的continue
对于 do while 语句 continue 关键字会出现在循环体内部,它的作用是跳过 continue 语句之后的循环语句,转到 while 语句的条件判断部分进行下一次循环的判断。
由于 do while 语句的循环调整部分在循环语句里,所以使用 continue 很容易让代码陷入死循环。
3、do while语句中的break
对于 do while 语句中出现的 break ,同样一般出现在循环体内部,作用是永久终止循环,即本次循环break之后的语句和以后的循环都不再执行,直接跳到 do while 语句之后。
三、for语句
1、语法结构
对比三种循环语句,可以发现所有的循环语句都存在这三个部分——初始化,条件判断以及调整。
只是从语法结构来讲 for 循环是最紧凑的。这样子在查找修改上也是最方便集中。所以三种语句的使用频率是:for > while >do while。
2、for语句中的continue
对于 for 语句 continue 关键字会出现在循环体内部,它的作用是跳过 continue 语句之后的循环语句,转到 for 语句的调整部分进行变量的调整,再进入判断部分进行下一次循环的判断。
由于 for 语句的循环调整部分在循环语句外,所以使用 continue 不会让代码陷入死循环,也就使得 for 语句更加灵活。
3、for语句中的break
对于 for 语句中出现的 break ,和另外两种语句一样,一般出现在循环体内部,作用是永久终止循环,即本次循环break之后的语句和以后的循环都不再执行,直接跳到 for 语句之后。
4、for 语句的一些编程“好习惯”及注意事项
- - -“好习惯”
在写条件判断部分时最好写成不带等号的形式:
for(i = 0;i < 10;i++) //不带等号
for(i = 0;i <= 9;i++) //带等号
虽然上面两种形式都可以实现十次循环,但是第一种明显好于第二种。
首先,若是循环体内有数组的话,i 的值可以直接对标到数组的下标上,调用更加方便;其次,在某些情况下,前者的判断部分可以表示次数,就有了实际意义。
- - -注意事项
- 对于不是很熟练运用的人,不要在循环体内部随意改变循环变量的值,这样可能抢夺了调整部分的任务,使得 for 语句失去控制。
- 对于括号里的三个表达式,有的时候会省略掉。
------ 若是初始化部分省略了,那么 for 语句将不能嵌套使用,因为内层的 for 语句走完一遍,它的循环变量就变成了不满足条件部分的值,没有了初始化部分,在后面的外层循环里内层循环相当于失效。
------ 若是判断部分省略了,那么计算机默认判断部分恒为真,这时也没有在循环体内部作处理的话,会让代码陷入死循环。
5、趣味小题
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0, j = 0; j = 0; i++, j++)
{
j++;
printf("请问循环多少次?\n");
}
return 0;
}
最后结果是0次。这是因为条件判断部分值为0,不满足条件,直接跳出了 for 循环。
四、goto语句的认识
goto语句是将控制流程无条件跳转到另一条语句的语句。
一般用法就是终止某些深度嵌套的程序的结构。例如需要跳出多层循环时,break 只能跳出一层,达不到目的,这时就可以使用 goto 语句。
有一个形象的说法,就像一栋大楼着火了,break只能从一层一层下,但是goto语句可以咻的一下从窗户离开火场,是不是很牛!
当然,在C语言中要尽量少用它!!因为它会影响到程序的整体结构,使得可读性变得很差。