选择语句和循环语句


一、什么是语句?

C语言中由一个分号 ; 隔开的就是一条语句。

printf("hehe");//空语句
1+2;

二、分支语句(选择结构)

1. if语句

🌟语法结构🌟

if (表达式)
  语句;

if (表达式)
  语句1;
else
  语句2;

多分支🌿

if (表达式1)
  语句1;
else if (表达式2)
  语句2;
else
  语句3;

1.1 悬空else

#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;
}

在这里插入图片描述
❗❗❗

else和离得最近的可以匹配的 if 匹配
改正:
//适当的使用{}可以使代码的逻辑更加清楚。
#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;
}

在这里插入图片描述

1.2 if书写形式的对比

//代码1
if (condition) {
   return x;
}
return y;          //若调用函数,遇到return则返回,不会执行其后代码

//代码2
if(condition)
{
   return x;
}
else
{
   return y;
}

代码1和代码2都为正确代码,但是代码2更加规范。

//代码3
int num = 1;
if(num == 5)
{
   printf("hehe\n");          //若有错误不易被发现
}

//代码4
int num = 1;
if(5 == num)                 //可避免错误不被发现
{
   printf("hehe\n");
}

代码3和代码4都为正确代码,但是代码4更加好用,可以避免将“==”写成“=”的错误!

1.3 练习

🌸 判断一个数是否为奇数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);

	if (a % 2 == 1)
		printf("Yes\n");
	else
		printf("No\n");

	return 0;
}

🌸 输出1-100之间的奇数

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 100)
	{
		//判断i是否为奇数
		if (i % 2 == 1)
			printf("%d ", i);
		i++;
	}

	return 0;
}

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

	return 0;
}

1.4 注意

#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age < 18)//如果表达式的结果为真,则语句执行。(0表示假,非0表示真)
    {
        printf("少年\n");
    }
    else if (age >= 18 && age < 30)                    
    {
        printf("青年\n");
    }
    else if (age >= 30 && age < 50)
    {
        printf("中年\n");
    }
    else if (age >= 50 && age < 80)
    {
        printf("老年\n");
    }
    else
    {
        printf("老寿星\n");
    }
    return 0;
}

在这里插入图片描述
💡如果将age >= 18 && age < 30写成18<=age<30会怎样呢?

#include <stdio.h>
int main()
{
    int age = 10;
    if (18 <= age < 30)                  
        printf("青年\n");
    else if (age >= 30 && age < 50)
        printf("中年\n");
    else if (age >= 50 && age < 80)
        printf("老年\n");
    else
        printf("老寿星\n");
    return 0;
}

在这里插入图片描述
👀原因:
如果age=10,则10>=18为假,假为0,进而有0<30为真,故输出青年。

❗❗❗

注意不能用数学形式写表达式,会产生错误。

2. switch语句

switch语句也是一种分支语句。常常用于多分支的情况。

switch(整型表达式)
{
  语句项;
}

而语句项是什么呢?

//是一些case语句:
//如下:
case 整形常量表达式:
   语句;

2.1 在switch语句中的 break

在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。

#include <stdio.h>
int main()
{
    int day = 1;
    switch (day)
    {
        case 1:
            printf("星期一\n");         
        case 2:
            printf("星期二\n");       
        case 3:
            printf("星期三\n");      
        case 4:
            printf("星期四\n"); 
        case 5:
            printf("星期五\n"); 
        case 6:
            printf("星期六\n");   
        case 7:
            printf("星期天\n");    
    }
    return 0;
}

在这里插入图片描述
💡 加上break会得到想要的结果吗?

#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.2 default子句

💡 如果表达的值与所有的case标签的值都不匹配怎么办?
  结果就是所有的语句都被跳过,程序并不会终止,也不会报错。

💡 如果在语句列表中增加一条default子句会怎样?

当 switch表达式的值并不匹配所有case标签的值时,这时default子句后面的语句就会执行。
每个switch语句中只能出现一条default子句。
default语句可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。

#include <stdio.h>
int main()
{
    int day = 0;
    switch (day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("weekday\n");
        break;
    case 6:
    case 7:
        printf("weekend\n");
        break;
    default:                                 //放在前面也不影响
        printf("输入错误,请输入(1 - 7)的数字\n");
        break;
    }
    return 0;
}

在这里插入图片描述

2.3 练习

下面代码结果是什么?

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
    {
    case 1:
        m++;
    case 2:
        n++;
    case 3:
        switch (n)
        {//switch允许嵌套使用
        case 1:
            n++;
        case 2:
            m++;
            n++;
            break;
        }
    case 4:
        m++;
        break;
    default:
        break;
    }
    printf("m = %d, n = %d\n", m, n);
    return 0;
}

在这里插入图片描述

三、循环语句

1. while循环

while(表达式)
  循环语句;

while语句的执行流程
         while 语句的执行流程图

1.1 while语句中的break和continue

🌸 break介绍

#include <stdio.h>
int main()
{
    int i = 1;
    while (i <= 10)
    {
        i = i + 1;
        if (i == 5)
            break;    //用于终止整个循环
        printf("%d ", i);
    }
    return 0;
}
//代码输出结果为:2 3 4

总结break在while循环中的作用:

其实在循环中只要遇到break,就直接跳出当前循环(只跳出一层循环)。
如果你的循环是嵌套循环,那么需要按照嵌套的层次逐步使用break跳出循环。
🌸 continue介绍
 #include <stdio.h>
 int main()
 {
     int i = 1;
     while(i<=10)
     {
           i = i+1;
           if(i == 5)
               continue;        
//跳过本次循环continue后面的代码,直接去while循环的判断部分。 
           printf("%d ", i);
     }
     return 0;
 }

在这里插入图片描述
总结continue在while循环中的作用:

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

2. for循环

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

表达式1
表达式1为初始化部分,用于初始化循环变量的。(初始化部分只执行了一次)
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。

在这里插入图片描述
         for 语句的执行流程图

2.1 对比for和while循环

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
    printf("hehe\n");
    i = i+1;//调整部分
}

//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
    printf("hehe\n");
}

结论:
while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。for循环使用的频率也最高

2.2 for循环中的break和continue

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。但是还是有些差异:

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}
//运行结果:1 2 3 4 6 7 8 9 10
#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10)
    {
        if(i == 5)
            continue;       
        printf("%d ", i);
        i = i+1;
    }
    return 0;
}                      //死循环

在这里插入图片描述

2.3 for语句的循环控制变量

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

在这里插入图片描述

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

2.4 一些for循环的变种

#include <stdio.h>
int main()
{
    //变种1
    for(;;)  
    //for循环的初始化、判断、调整是可以省略的。判断部分如果省略意味着判断条件恒为真,导致死循环。
    {
        printf("hehe\n");
    }
    
    //变种2
    int x, y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
    {
       printf("hehe\n");
    }
    return 0;
}

👀👀👀比较两段代码:

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

结果:打印出100个hehe

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

结果:打印出10个hehe
✨原因:i=0时,j循环10次打印出10个hehe后,j的值变为10,不再初始化。

for循环中,三个条件最好不要省略。

2.5 笔试题

//请问循环要循环多少次?
#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,所以条件为假,则不运行。

3. do…while()循环

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

在这里插入图片描述
         do 语句的执行流程图

3.1 do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用。

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

3.2 do while循环中的break和continue

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

在这里插入图片描述


如有问题,欢迎批评指正呀!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗小小粒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值