初始C语言-分支与循环语句

一、语句

1. 什么是语句?

C语句可分为以下五类:

1. 表达式语句

2. 函数调用语句

3. 控制语句

4. 复合语句

5. 空语句

本章后面介绍的是控制语句。

2. 控制语句:

用于控制程序的执行流程,以实现程序的各种结构方式( C语言支持三种结构:顺序结构、选 择结构、循环结构 ),它们由特定的语句定义符组成,C 语言有九种控制语句。
可分成以下三类:

1. 条件判断语句也叫分支语句:if语句、switch语句;

2. 循环执行语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。

二、分支语句

1.if语句

语法结构:

1)单分支if

                if ( 表达式 )
                    语句 ;
2)if else语句(双分支)
                if ( 表达式 )
                    语句1 ;
                else
                    语句2 ;
3)if elseif else(多分支)    
                if ( 表达式 1 )
                    语句1 ;
                else if ( 表达式 2 )
                    语句2 ;
                else
                    语句 3 ;
注意:
如果表达式的结果为真,则语句执行。在C语言中如何表示真假?
0表示假,非0表示真。

如果条件成立,要执行多条语句,怎应该使用代码块。
这里的一对 { } 就是一个代码块。

 

1.1例子: 

#include <stdio.h>
//代码1
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
}

//代码2
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
    else
   {
        printf("成年\n");
   }
}

//代码3
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("少年\n");
   }
    else if(age>=18 && age<30)
   {
        printf("青年\n");
   }
    else if(age>=30 && age<50)
   {

 1.2悬空else

有时会遇到这种代码,由于省略了{},或者没有对齐代码(缩进格式问题),导致对代码理解产生误解。

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要

例子:

这个else到底与哪个if是匹配的?代码最终是什么结果?其实是第二个if,结果是什么也没输出。原因很简单:

else的匹配else是和它离的最近的if匹配的。

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else//与上面最近的if进行匹配
        printf("haha\n");
    return 0;
}

其实上面的代码就等于这样

当a=0时,第一个if语句判断a==1表达式为假,不执行该语句。压根就没进去这个代码块,于是直接跳到return 0;结束该程序了。

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
        {
            printf("hehe\n");
        }
        else//与上面最近的if进行匹配
        {
            printf("haha\n");
        }
    }
        
    return 0;
}

修改代码:

而我们真正想要的是这样

a==1的时候如果b==2打印hehe,否则a为其他值,打印haha

修改代码后,逻辑明显清晰了许多,所以养成良好的代码习惯很重要

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
   {
        if(b == 2)
       {
            printf("hehe\n");
       }
   }
    else
   {
         printf("haha\n");
   }       
    return 0;
}

2.switch语句

switch 语句也是一种分支语句。
常常用于多分支的情况。
比如:
输入 1 ,输出星期一
输入 2 ,输出星期二
输入 3 ,输出星期三
输入 4 ,输出星期四
输入 5 ,输出星期五
输入 6 ,输出星期六
输入 7 ,输出星期日
那我没写成 if...else if ...else if 的形式太复杂,那我们就得有不一样的语法形式。
这就是 switch 语句。
switch ( 整型表达式 )
{
  //  语句项;
case 整形常量表达式 :
    语句 ;
}

2.1 switch语句中的 break

switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。
        每个case里的语句,需要适当的break,因为在switch语句里,是从上到下依次执行的,没有break代表着会一直往下执行,直至执行完最后一条switch里的语句。
例子1:
#include <stdio.h>
int main()
{
    int day = 1;
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}

 没有break将得到这样的结果:所有语句执行了,全输出来了

例2:

有时候我们的需求变了:
1. 输入 1-5 ,输出的是 “weekday”;
2. 输入 6-7 ,输出 “weekend”
所以我们的代码就应该这样实现了:
#include <stdio.h>
int main()
{
    int day = 3;
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

 

编程好习惯
在最后一个 case 语句的后面加上一条 break 语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break 语句)。

2.2 default子句

如果表达的值与所有的case标签的值都不匹配,default来与该匹配
例子: 当不匹配时,默认走了default语句
int main()
{
	int n = 0;
	scanf("%d", &n);

	switch (n)
	{
	case 1:
	case 2:
	case 3:
		printf("3以内\n");
		break;
	default:
		printf("非3以内的数\n");
		break;
	}

	return 0;
}

编程好习惯
在每个 switch 语句中都放一条 default 子句是个好习惯,甚至可以在后边再加一个 break

 三、循环语句

做一些重复往返的工作时,用循环语句

1.while语句

例如:在屏幕上打印 1-10 的数字。
#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)//循环判断条件,当表达式为真进入循环体,否则不进入循环;当进入循环后,条件不满足时,跳出循环
 {
     printf("%d ", i);
     i = i+1;
 }
 return 0;
}

1.1while语句中的break与continue

//理解break和continue
int main()
{
	int i = 1;
	while (i <= 10) 
	{
		//if (5 == i)
		//	break;//1 2 3 4
		//break结束整个循环,永久终止循环
		if (5 == i)
			continue;//1 2 3 4 死循环
		//跳过此次循环,忽略跳过continue后面的代码,重新回到该while循环判断表达式,是否进入下一个循环
		printf("%d ", i);
		i++;
	}
	return 0;
}
break最终结果:
永久结束整个循环

 continue最终结果:

仔细观察,此时程序并没有结束,在4后死循环了

1.2总结:

1)break while 循环中的作用:
其实在循环中只要遇到 break ,就停止后期的所有的循环,直接终止循环。
所以: while 中的 break 是用于 永久 终止循环的。
2)continue while 循环中的作用就是:
continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行,
而是直接跳转到 while 语句的判断部分。进行下一次循环的入口判断。

2.for循环

for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
循环语句 ;
for(初始化;判断;调整)
语法
表达式 1
表达式 1 初始化部分 ,用于初始化循环变量的。
表达式 2
表达式 2 条件判断部分 ,用于判断循环时候终止。
表达式 3
表达式 3 调整部分 ,用于循环条件的调整。

2.1同样的例子:

使用 for 循环 在屏幕上打印 1-10 的数字。
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}

2.2 breakcontinuefor循环中

我们发现在 for 循环中也可以出现 break continue ,他们的意义和在 while 循环中是一样的。

 break最终结果:

continue最终结果: 

2.3 for语句的循环控制变量

建议:
1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议 for 语句的循环控制变量的取值采用 前闭后开区间 写法。
// 前闭后开的写法
for ( i = 0 ; i < 10 ; i ++ )
{}
// 两边都是闭区间
for ( i = 0 ; i <= 9 ; i ++ )
{}

2.4 一些for循环的变种

1)for循环中的 初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。

例如这样就死循环了

//代码1
for(;;)
{
printf("hehe\n");
}

2)省略初始化带来的问题

正常情况下打印3*3也就是9和hehe

//代码2
   int i = 0;
   int j = 0;
   //这里打印多少个hehe?
   for(i=0; i<3; i++)
  {
       for(j=0; j<3; j++)
      {
          printf("hehe\n");
      }
  }

当省略i=0和j=0,则只打印3次hehe

 2.5大坑题

一次都不循环,因为k=0;这个判断条件=是赋值,而不是==判断是否相等,

所以此时表达式恒为假,不进入循环

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

3. do...while()循环 

循环至少执行一次,使用的场景有限,所以不是经常使用。
do
循环语句 ;
while ( 表达式 );

 例子:

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

3.1do while循环中的breakcontinue

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

4.goto语句 

//滥用会导致程序流程混乱或者导致死循环
//多层循环时,break可以跳出单层循环,跳出错层循环需要使用多次,很麻烦,所以可以使用goto语句跳出多层循环

例子1:死循环

#include<stdio.h>
//goto语句死循环例子
int main()
{
again:
	printf("hehe\n");
	printf("haha\n");
	printf("heihei\n");
	goto again;//goto语句跳转到agian的位置

	return 0;
}

运行结果:死循环打印 

例子2:恶作剧关机程序(请慎用!!!否则真的关机了!!)

//关机程序:
#include<string.h>
#include<stdlib.h>
int main()
{
	//关机命令 shutdown
	//shutdown -s -t 60 //60s之后关机
	//shutdown -a 取消关机

	char arr[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("请注意,你的电脑将在1分钟后关机。如果输入:我是猪,就取消关机\n");
	scanf("%s", arr);

	if (strcmp(arr, "我是猪") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}

	//不用goto语句也可以
    //循环方法
	//while (1)
	//{
	//	printf("请注意,你的电脑将在1分钟后关机。如果输入:我是猪,就取消关机\n");
	//	scanf("%s", arr);

	//	if (strcmp(arr, "我是猪") == 0)
	//	{
	//		system("shutdown -a");
	//		break;
	//	}
	//}
	return 0;
}

运行结果:

5.循环输入

while(scanf("%d",&a) != EOF)

{

}

当输入的内容不为空,就会执行while循环

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值