分支和循环语句(二)

        疯狂补作业……

        这几天我悟出了一个人生哲理——欠下的你迟早要还!!!而且是马不停蹄的还!憋说了,上刑……

        上一次我们介绍完分支结构后这次我们来啃另一块骨头——循环。循环语句主要是while、for 和 do while ,那么话不多数,开饭了兄弟们!

目录

1.while循环语句

1.1 简单介绍

1.2 while语句中的break和continue

1.3 while 的小代码

2. for循环语句

2.1 语法

2.2 break 和 continue 在 for 循环中 

2.3 for 语句的循环控制变量

2.4 for 循环语句的变种

3. do...while()循环

 3.1 语法

3.2 break 和 continue 在该循环中的应用

4. goto 语句


1.while循环语句

1.1 简单介绍

        (啥也别说了,昨天学的新技能,搞了个带目录的,好像确实简洁了不少。)我们前面学习的分支语句适合生活中很多一次性选择的场景,但除了一次选择之外,往往还有很多循环选择的问题,比如量变的积累产生质变,同一件事完成很多次才能得出一个结果,对于这样的事用if语句显然十分的不方便,这里就可以用循环语句——while来实现。

while(表达式)
    循环语句;

        上面便是while循环语句的基本结构,其主要表达的意思就是,表达式为真时,进入循环语句,循环语句结束后再次跳回表达式的判断,直至表达式为假,跳出while 循环。这里面的循环语句也可以是语句列表,但注意要用 { } 括起来。

1.2 while语句中的break和continue

        break的作用和在if 里的基本是一样的,就是终止后面的语句执行,放在while 则是终止后面语句以及整个循环的执行。我们简单写一段代码来阐述一下:

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

//这段代码最终的输出结果为 :0 1 2 3 4 5 6 7 8 9
int main()
{
	int i = 0;
	while (i < 10)
	{
		printf("%d ", i);
		i++;
		break; //我们在此处加了 break 后,循环到此处直接终止跳出
	}
	return 0;
}

//最终输出的结果为:0
int main()
{
	int i = 0;
	while (i < 10)
	{
		printf("%d ", i);
		i++;
		if(i==5)  //在这里加上一个分支语句 if ,如果i=5,执行break,实现打印0~4的功能
		break;    //
	}
	return 0;
}

//最终的打印结果为:0 1 2 3 4 

        大家吧唧吧唧嘴,琢磨琢磨,我们进入下一个话题——continue。

        continue的功能和break 有着异曲同工之妙,break 是直接放弃循环后面的语句跳出循环,而continue是放弃后面的语句跳回循环的开始,也就是表达式判断部分。

int main()
{
	int i = 0;
	while (i < 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
		//if(i==5)     // 如果放在这里结果还是0~9,因为continue后面没有语句,跳过和没跳过都是回到判断表达式部分。
		//continue;
	}
	return 0;
}

//最终实现的功能就是打印 0 1 2 3 4 6 7 8 9

        所以 break 和 continue 在循环语句中作用还是蛮大的,能够让循环语句更加灵活地被运用。

1.3 while 的小代码

#include <stdio.h>
int main()
{
 int ch = 0;
 while ((ch = getchar()) != EOF)
       putchar(ch);
    return 0; }

        这段代码的主要功能就是:你输入一个一个数字或字符,按回车之后会自动复制你输入的数字或字符然后跳到下一行。这里需要我们简单的了解一下 getchar 和 putchar 的功能。

        这两个函数是输入和输出函数,类似于 scanf 和 printf 函数,getchar()是从终端输入一个字符语法如下:

int getchar()

ch = int getchar()//从终端输入一个字符并赋给字符变量ch

        而 putchar()是字符数据输出,作用是向显示设备输出一个字符,语法如下:

int putchar (int ch)

        上述声明的参数 ch 是要进行输出的字符,可以是字符型变量或整型变量,也可以是整型常量。

        所以能够实现上面的循环,如果想退出循环,需要按 ctrl +z 回车结束循环。这里在给大家演示一下输入密码后选择是和否的代码。

int main ()
{
    char password[20]={0};
    printf("请输入密码:>")
    scanf("%s",password);
    getchar();  //为了清空输完密码之后的"\n"。
    printf("请确认密码");
    int ret = getchar();
    if ('Y'==ret)
    {
        printf("Yes\n");

    }
    else
    {
    printf("No\n");
    }
    return 0;
}

        简单的来介绍一下这段代码的原理。首先是定义一个字符数组来存储要输入的密码,然后是scanf 函数用来输入密码,输入密码后会按下一个回车键,这时候“密码\n”会被存放到一个缓冲区的地方,只有我们敲了回车,也就是在缓冲区中放入“\n”之后,scanf 才会去缓冲区中拿走字符串,且只拿走字符串部分,会把“\n”留在缓冲区内,下一步如果不加一个 getchar 函数将缓冲区的“\n”读取走的话,那么就来到确认密码的代码处,此处的 getchar 直接将缓冲区的“\n”读取走致使没有输入指令直接输出“No”,因为这里相当于 getchar 将读到的“\n”赋值给了 ret,导致ret不等于Y,直接输出No。

        此外大家还要注意就是 scanf 读取缓冲区内的数据时,如果遇到空格也是自动截止的,所以如果密码中有空格出现,再用上面的代码依然会出错,因为 getchar 一次只能读取一个字符,而我们需要在下一个 getchar 之前将缓冲区清理干净,这里用到的就是这样一段代码来清理缓冲区:

while ((ch = getchar()) != '\n')
	{
		;
	}

2. for循环语句

2.1 语法

        for 循环的表达式如下:

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

        同样的,循环语句在这里如果是列表的话,需要带上 { } ,表达式1为函数的初始化部分,用于初始化循环变量的;表达式2为条件判断部分,用于决定循环的继续和终止;表达式3为调整部分,是用来调整循环条件的。执行的顺序为表达式1、表达式2、循环语句、表达式3、表达式2、循环语句、表达式3……直到不符合表达式2,跳出循环。举一个简单的小例子,打印数字1~10:

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

        相同的功能我们用 while 来实现:

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

        相比较而言,for 循环更加紧凑集中,查找修改更加容易一些,风格更胜一筹,for循环使用的频率最高。

2.2 break 和 continue 在 for 循环中 

        break 和 continue 在 for 循环中和在 while 循环中的作用基本是一致的,遇到 break 直接跳过后面的循环语句结束循环。但是 continue 有一些不同,遇到他之后是跳过后面的循环回到 for 循环中的表达式3也就是调整部分,而不是 while 中的判断部分,这里需要大家清楚。

2.3 for 语句的循环控制变量

        不可以在 for 循环体内修改循环变量,防止 for 循环失去控制 。建议循环控制变量的取值遵循前闭后开区间的写法,当然了一些情况下两边都是闭区间会更合理一点,因情况而定。开闭区间举例:

int  i = 0;

for(i = 0;i<11;i++)//这个就是前闭后开区间写法

for(i = 0;i<=10;i++)//这个就是前闭后闭区间的写法

        在这里,显然就是前闭后闭区间的写法更合适一些,所以大家要灵活应用。

2.4 for 循环语句的变种

for(;;)

        这个 for 循环语句省略了初始化部分、判断部分和调整部分,实际上是可行的,但是不建议大家省略,很容易出错,这里知道一下可以省略就 。

另外,for 循环也可以进行嵌套使用,举个栗子:

 for(i=0; i<3; i++)
   {
        for(j=0; j<3; j++)
       {
            printf("加油\n");
       }
   }

        这里我就简单写啦,这段代码的作用就是打印9个“加油”,因为外部循环一次内部循环三次,接下来就是小学数学啦,交给你啦 。

        还有就是一个循环中可以由多个变量来控制循环,下面的代码就是由x和y来对整个循环进行控制,判断条件和调整部分也均有x、y两个变量:

int x, y;
    for (x = 0, y = 0; x<2 && y<5; x++, y++)
   {
        printf("hehe\n");
   }
 return 0;
 }

3. do...while()循环

 3.1 语法

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

        与 while 相比,这个循环的的特点是先执行一次循环语句,然后再进入到 表达式的判断部分,判断真假后再进行下一步是否执行循环语句,所以这就决定着这个结构的循环至少要执行一次,使用的场景较为局限,但是其具备的功能有时是其他循环语句替代不了的。

3.2 break 和 continue 在该循环中的应用

        和上面两个循环的基本用处是一样的,break直接跳过后面的语句,跳出循环并终止,continue 则是跳过后面语句进入到 表达式判断部分。

4. goto 语句

         除了上面我们提到的 break 和 continue 能够跳转到规定的位置,C 语言还提供了可以随意滥用的 goto 语句和标记跳转的标号。 但从理论上来说 goto 语句是没有必要的,实践中没有他也一样能很容易的写出代码,但是在某些场合下 goto 语句还是用的着的,最常见的就是终止一些深度嵌套(无限套娃)的结构的处理过程。比如说可以一次跳出多层循环,而 break 是只能跳出一层的循环,具体见代码:

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)

        这段代码可以实现最里层的 if 的执行语读到 goto 之后直接跳转到相应的位置——error处,然后向下进行代码的读取,实现了一步从最内环跳到最外环。但是在实际的应用中,goto 很少被应用,因为本身具备的性质很容易让一段代码出现bug。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值