C语言—循环结构

目录

循环结构

 循环控制语句 

循环类型

一.while循环

语法

break在while循环中的作用 

 continue在while循环中的作用 

多组输入

清空输入缓存区

二.for循环

语法

三.do while

语法

 break和continue在do while循环中的使用


循环结构

循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。

根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。

 循环控制语句 

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转

在正式讨论循环类型前,先大致介绍一下循环控制语句

break: 

 当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

contine: 

告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。

循环类型

在使用代码解决一些问题时,会出现一些重复度很高的操作,需要多次执行同一块代码。在这种情况时,使用C语言提供的循环类型可以很好的解决这些问题。

C语言提供了三种循环类型 while     for    do while

一.while循环

语法

  • while(表达式)
    {
     循环语句;
    }
    
    
  • 表达式
  1.  表达式的返回值为任意非零值时都为真。
  2. 当条件为真时执行循环。 当条件为假时,退出循环,程序流将继续执行紧接着循环的下一条语句。
  • 循环语句
  1. 可以是一个单独的语句,也可以是几个语句组成的代码块。

例:打印1~10

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)    //当i<=10时 表达式返回值非零为真,进入循环
 {
 printf("%d ", i);
 i = i+1;        //每循环依次i自增1,第十次循环时 i自增为11。
 return 0;       //表达式返回值为0,结束循环。
}

 

break在while循环中的作用 

循环中遇到break,就停止后期的所有的循环,直接终止循环。

while中的break是用于永久终止循环的

举一个例子

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 

 continue在while循环中的作用 

continue是用于终止本次循环的

本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

举一个例子

#include <stdio.h>

int main()
{
    int i = 0;
    while (i <= 10)
    {
        i = i + 1;
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}

 在while()循环中使用continue时,可能会跳过循环中的调整部分,导致死循环

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 

 可以发现函数没有结束,死循环了。使用continue

多组输入

     多组输入的实现也常常通过while循环来达成。再写一些题目时,会发现很多题目都有多组输入的要求,这时候使用while循环便能很好的解决问题

以判断两数大小为例

未要求多组输入代码如下:

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    if (a > b)
        printf("%d>%d\n", a, b);
    else if (a < b)
        printf("%d<%d\n", a, b);
    else
        printf("%d=%d\n", a, b);

    return 0;
}

 当要求多组输入时:

#include<stdio.h>
int main()
{
    int a =0;
    int b =0;
    while(scanf("%d %d",&a,&b) != EOF)
    {
        if(a > b)
            printf("%d>%d\n",a,b);
        else if(a < b)
            printf("%d<%d\n",a,b);
        else
            printf("%d=%d\n",a,b);
    }
    return 0;
}

 可以发现在代码中多了这样一个部分

    while (scanf("%d", &n) != EOF)
    {
          代码块
    }

这样一个代码乍然出现在面前,想必是让人 摸不着头脑。

想要理解这个代码,就需要先了解一下scanf()函数的返回值。

scanf()的返回值:

返回值类型 int

该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

返回成功匹配和赋值的个数,如下所示:

int main()
{
	int a = 0;
	int b = 0;

	printf("%d", scanf("%d", &a));
	printf("%d", scanf("%d %d", &a, &b));
	return 0;
}

 而EOF就让人有些摸不到头脑,转到定义便可以发现,EOF其实是一个标识符常量,值为 -1

 那么表达式 while (scanf("%d", &n) != EOF) 的意思为,当scanf()的返回值不为-1时,表达式为真,进入循环。这时候便出现了一个问题,scanf()返回值为返回成功匹配和赋值的个数,个数最小也不为 -1 ,何时会停止输入呢?当在键盘上按下 ctrl + z 时,scanf()将会返会 EOF(-1),此时循环便会结束。

多组输入的代码,也有多种写法。

比如

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    while (scanf("%d %d", &a, &b) == 2 ) //当正确输入时返回值为2进入循环
    {
        if (a > b)
            printf("%d>%d\n", a, b);
        else if (a < b)
            printf("%d<%d\n", a, b);
        else
            printf("%d=%d\n", a, b);
    }
    return 0;
}

 还有这样写的

    while (~scanf("%d", &n))
    {
          代码块
    }

 这种写法与  while(scanf("%d %d",&a,&b) != EOF) 等价,只是做了一些变形。

正常输入时,scanf()的返回值为非负整数,按位取反后为非零,及表达式为真。

而当需要结束输入时,scanf()的返回值为 -1,按位取反的值恰好是0,及表达式为假,终止循环。

清空输入缓存区

while循环也可以用来清空输入缓存区

先来看一段代码

int main()
{
	char a = 0;
	char b = 0;
	scanf("%c", &a);
	scanf("%c", &b);
	if (a == 'a')
		printf("hello ");
	if (b == 'b')
		printf("world");
	else
		printf("haha");

	return 0;
}

对于程序输出的结果是不是很是疑惑?我们来看一下 变量b 中到底存了什么

 

 变量b中存储的居然是空格。

当输入  a b时输入缓存区实际输入了3个字符 'a'、' ' 、‘b’。当使用scanf("%c", &a)时‘a’被读取,

scanf("%c", &b) 时取走了‘ ’,导致了输出hello haha这一尴尬的场景。

这时使用 while ((c = getchar()) != EOF && c != '\n');便可以很好的解决问题。

while ((c = getchar()) != EOF && c != '\n') 不断地使用getchar()获取输入缓存区的内容,直到获取到'\n'为止

二.for循环

  • 语法

  • for(表达式1; 表达式2; 表达式3)
    {
     循环语句;
    }

    表达式1 表达式1为初始化部分,用于初始化循环变量的。

  • 首先被执行,且只会执行一次。这一步允许声明并初始化任何循环控制变量。也可以不在这里写任何语句,只要有一个分号出现即可。

  • 表达式2 表达式2为条件判断部分,用于判断循环时候终止。

  • 表达式2将进行判断,如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。

  • 表达式3 表达式3为调整部分,用于循环条件的调整。

  • 该语句允许更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。

例:打印1~10

#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

 break和continue在for循环中的作用

整体上与在while循环中差别不大,不过在for循环中使用continue不会跳过调整部分,不会出现像while循环中不当使用continue导致的死循环。

例:

使用break

#include <stdio.h>
int main()
{
 int i = 0;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 break;
 printf("%d ",i);
 }
 return 0;
}

使用continue

#include <stdio.h>
int main()
{
 int i = 0;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 continue;
 printf("%d ",i);
 }
 return 0;
}

 未出现死循环

不过在使用for循环时,不建议在循环体内修改循环变量,防止 for 循环失去控制。

一般在不知需要循环几次时,往往会采用while循环。明知循环次数时,使用for循环会好很多。

三.do while

语法

do
{
   循环语句;
}
while(表达式);

 do while循环while很相近,不过循环至少循环一次,使用的场景有限,所以不是经常使用

例:打印1~10

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

 break和continue在do while循环中的使用

与在while中区别不大,也存在使用continue可能导致代码死循环的情况。

例:

使用break

#include <stdio.h>
int main()
{
    int i = 1;

    do
    {
        if (5 == i)
            break;
        printf("%d ", i);
        i++;
    } while (i <= 10);

    return 0;
}

 使用continue

#include <stdio.h>
int main()
{
    int i = 1;

    do
    {
        if (5 == i)
            continue;
        printf("%d  ", i);
        i++;
    } while (i < 10);

    return 0;
}

while一样,出现了死循环。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值