初识C语言 第五章 分支(if语句,switch语句)

😍😍😍大家好,我是十月天香,希望你看完后能有所帮助,如果有错误请指出来,共同进步!

本文由十月天香原创,如有转载请告知。

😉😉😉个人主页:十月天香——>CSDN博客。🎁🎁🎁

💯💯💯系列专栏:初识C语言。🎉🎉🎉

💖💖💖欢迎各位:点赞+关注+收藏+留言。🥳🥳🥳

目录

前言

if语句

else

分支中包含多条语句 

嵌套if 

悬空else问题 

关系操作符

逻辑操作符:&&、||、! 

逻辑取反符 

与运算符 

或运算符 

练习 

短路

switch语句

if语句和switch语句对比

switch语句中的break

练习1:

练习2:

 switch语句中的default

switch语句case和default顺序问题 


前言

想在学校C语言实操课上和法摸鱼吗?想C语言课上玩游戏被老师表扬吗?,那么现在我们将走进分支和循环,你是否准备好呢?上吧,学好他们在课上写个小游戏摸鱼吧!

——————————————————————————————————————————

if语句

if语句语法如下:

if(表达式)
   语句;

表达式成立(为真),则语句执行;表达式(为假),则语句不执行。

C语言中,0为假,非0为真,也是表达式结果为0,语句不执行;结果为非0,语句执行。

下面我们看一个例题: 输入一个整数,判断是否为奇数?

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a % 2 == 1)
       printf("%d是奇数\n",a);
    return 0;
}

else

if....else...语句语法如下:

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

输入一个整数,判断是否为奇数,是打印奇数,否则打印偶数。

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d",&num);
    if(num % 2 == 1)
       printf("%d是奇数\n",num);
    else
       printf("%d是偶数\n",num);

    return 0;
}

 

通过上面的运行结果我们可以看出,当输入数据满足表达式num%2==1时,就走if语句,打印奇数;表达式不满足num%2==1,就走else语句,打印偶数。

所以表达式为真,执行if语句,表达式为假,执行else语句。 

我们再练习一个题目:输入一个年龄,>=18输出:成年,否则输出:未成年。

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

    if(age>=18)
       printf("成年\n");

    else
       printf("未成年\n");

    return 0;
}

分支中包含多条语句 

在编译器默认的情况下,if和else语句中都只控制一条语句,看代码:

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a>=18)
       printf("成年了\n");
       printf("可以谈恋爱\n");
    return 0;
}

你发现无论输入值是>=18 ,还是<18,“可以谈恋爱”都会被打印在屏幕上。

       是因为if语句只能控制printf("成年了\n");,if语句位真,打印、为假,不打印。对于printf("可以谈恋爱了");是独立存在的,不管if语句真假,都会被执行,想同时控制多条语句,可以用大括号{ }将代码括起来。

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a>=18)//if使用{}控制多条语句叫语句块,复合语句
    {    

       printf("成年了\n");
       printf("可以谈恋爱\n");

    }
    return 0;
}

else语句也可以用{ }括起来:

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a>=18)//if使用{}控制多条语句叫语句块,复合语句
    {    

       printf("成年了\n");
       printf("可以谈恋爱\n");

    }
    elae
    {

       printf("未成年\n");
       printf("不可以恋爱\n");

    }
    return 0;
}

嵌套if 

       在if...else...语句中,else可以于另一个if语句连用,构成多重判断。

比如:输入一个整数,判断输入是0,正数,负数。代码如下:

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

    return 0;
}

下面红框里的代码就是嵌套在前面else语句中的,构成嵌套if语句。

 在来一个例子:输入一个整数,如果整数>0,再判断奇偶并输出,否则输出负数。

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a > 0)
    {
       if(a % 2 == 0)
          printf("偶数\n");
       else 
          printf("奇数\n");
    }
    else
    {
       printf("负数\n");
    }

    return 0;
}

来一个题目练练手:输入一个年龄,如果<18打印少年、18-44打印青年、45-59打印中老年、60-89打印老年、90以上打印老寿星。

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a<18)
       printf("少年\n");
    else if(a<=44)
       printf("青年\n");
    else if(a<=59)
       printf("中老年\n");
    else if(a<=90)
       printf("老年\n");
    else 
       printf("老寿星\n");
    return 0;
}

还可以在此基础上进行改变,使其变得更加容易阅读:

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(a<18)
    {
       printf("少年\n");
    }
    else
    {   
         if(a<=44)
         {
             printf("青年\n");
         }
         else
         {
              if(a<=59)
              {
                  printf("中老年\n");
              }     
              else
              {
                  if(a<=90)
                     printf("老年\n");
                  else 
                     printf("老寿星\n");

              }   
          }
   
    }
    return 0;
}

悬空else问题 

如果有多个if和else,可要记住:else总是跟最近的if匹配。 

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

以上代码,输出结果:啥都不输出。

        虽然代码排版让else和第一个if语句对齐,让我们以为else和第一个if匹配,但实际上else和第二个if语句匹配,这也就是说,if...else...语句嵌套在第一个if语句中,第一个if语句不执行,后面的嵌套if...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;
}

关系操作符

C语言中用来比较的表达式,叫关系表达式,里面用到的运算符是关系运算符。常见的关系运算符如下:

>  //大于运算符
<  //小于运算符
>=  //大于等于运算符
<=  //小于等于运算符
==  //等于运算符
!=  //不等于运算符

          关系表达式通常返回0或1,表示真假。C语言中,0表示假,非0表示真。比如20>11返回1、11>20返回0。关系表达式通常用于if语句或while语句。 

注意:

        等于运算符==和赋值运算符=是两个不一样的运算符,有时写错,可以运行,但结果出人意料,为防止出现这种错误,可以将变量写在==右边。

if(3==a)

        这样将==写成=编译器就会报错。

注意:

        多个关系符不易连用。

a < b < c

这个看着合法,不会报错,但通常达不到想要的效果。因为关系运算符从左向右计算,实际执行的是:

(a < b) < c

 a<b先返回0或1,0或1再与c比较,如果想判断b在a、c之间的大小,可以写成:

a < b && b < c

比如:输入年龄,在18-36之间,打印青年

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(18 <= a <= 36)
    {
        printf("青年\n");
    }

    return 0;
}

 当我们输入10时,会打印青年,因为我们先表达式18<=10为假,返回0,再0<=36为真,所以打印青年,逻辑上有问题,应该改成:

#include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d",&a);
    if(18 <= a && a <= 36)
    {
        printf("青年\n");
    }

    return 0;
}

逻辑操作符:&&、||、! 

逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有:

&&:与运算符,就是并且的意思(两侧表达式为真,则为真,否则为假)。

||:或运算符,就是或者的意思(两测至少一个为真,否则为假)。

!:逻辑取反运算符(改变单个表达式真假)。

 

逻辑取反符 

           比如,有一个变量a,如果a为假,要执行语句,可以这样写代码:

int main()
{
	int a = 0;
	if (!a)
	{
		printf("do something\n");
	}
	return 0;
}

如果a为真,!a为假;a为假,!a为真,所以上面是a为假,执行if语句。

与运算符 

           &&是一个双目操作符,使用方法:a&&b,&&两边为真,表达式才为真。

比如,3月到5月是春天,代码如下:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a >= 3 && a <= 5)
	{
		printf("春天\n");
	}
	return 0;
}

或运算符 

           ||是一个双目操作符,使用方法:a||b,||两边至少一个为真,才为真。

比如,一年12月或1月或2月是冬天,代码如下:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if(a==12||a==1||a==2)
	{
		printf("冬天\n");
	}
	return 0;
}

练习 

输入一个年份,判断是否为闰年。

规则:1,能被4整除,且不被100整除

           2,能被400整除

//代码1

int main()
{
	int a = 0;
	scanf("%d", &a);
	if(a % 4 == 0 && a % 100 != 0)
	{
		printf("闰年\n");
	}
	else if(a % 400 == 0)
	{
		printf("闰年\n");
	}
	return 0;
}

//代码2

int main()
{
	int a = 0;
	scanf("%d", &a);
	if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
	{
		printf("闰年\n");
	}
	
	return 0;
}

短路

C语言逻辑运算符总是左侧的表达式求值,再对右侧的表达式求值,顺序保证,如果左侧表达式满足条件,就不对右侧求值,这种叫短路 。

if(a >= 3 && a <= 5 )

表达式中当a>=3为0时,即使不判断a<=5,表达式结果也为1。

if(a == 3 || a == 6|| a == 12)

 如果a==3,则不再判断后面,这个表达式结果为1。

        向上面仅知道左边结果就可以判断这个表达式的结果,是短路运算

switch语句

        switch语句是一种特殊形式的if...else...结构,用于判断条件有多个结果,把多重else...if...更改成可读性更好、更易用的形式。

switch(expression)
{
   case value1:
           statement
   case value2:
           statement
   default:
           statement
}

根据espression不同值,执行相应的case分支,如果没有对应值,就执行default。

注意: 

        switch后面,必须为整型表达式。

        case后面,必须为整型常量表达式。

if语句和switch语句对比

输入一个值,除3之后的余数:

       用if语句:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 3 == 1)
		printf("整除,余数0\n");
	else if(a%3==1)
		printf("余数1\n");
	else if (a % 3 == 2)
		printf("余数2\n");
	return 0;
}

        用switch语句: 

int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a % 3)
	{
	case 0:
		printf("整除,余数0\n");
		break;
	case 1:
		printf("余数1\n");
		break;
	case 2:
		printf("余数2\n");
		break;
	}
	return 0;
}

 注意:

case和后面数字之间必须有空格

每一个case语句执行完成后,要加上break,才能跳出switch语句。

switch语句中的break

int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a % 3)
	{
	case 0:
		printf("整除,余数0\n");
	
	case 1:
		printf("余数1\n");
		
	case 2:
		printf("余数2\n");
		
	}
	return 0;
}

上面的代码是将break去掉了,运行结果:

       7除以3本来余数是1,但是结果 却多打印一行“余数2”,是因为switch语句有分支效果,只有switch语句中使用break才能跳出switch语句,如果某个case语句后面没有break语句,代码将继续向下执行,可能执行其他case语句中的代码,直到遇到break或switch语句结束。

        switch语句中break语句非常重要,能实现真正分支效果,但不是每个case语句都要有break,看实际情况。

练习1:

            输入1-7的数字,打印对应周几。如输入:1,输出:周一。

int main()
{
	
		int a = 0;
		scanf("%d", &a);
		switch (a)
		{
		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;
}

练习2:

输入1-5,输出:工作日、输入6-7,输出:周末

int main()
{
		int a = 0;
		scanf("%d", &a);
		switch (a)
		{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("工作日\n");
			break;
		case 6:
		case 7:
			printf("周末\n");
			break;
	}
	return 0;
}

 switch语句中的default

       使用switch语句时,如switch后面表达式的值无法与case匹配,要不就不做处理,要不就加default语句。

switch(expression)
{
   case value1:
           statement
   case value2:
           statement
   default:
           statement
}

espression既不是value1也不是value2时,会执行default语句。

int main()
{
		int a = 0;
		scanf("%d", &a);
		switch (a)
		{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("工作日\n");
			break;
		case 6:
		case 7:
			printf("周末\n");
			break;
		default:
			printf("输入错误\n");
			break;
	}
	return 0;
}

switch语句case和default顺序问题 

没有强制的顺序要求,只要满足自己需求就可以了,通常我们把default放在最后面。(完)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值