C语言分支语句if,switch语句详细讲解

目录

前言

C语言是结构化的程序设计语言

顺序结构

选择结构(本篇博客所讲内容)

循环结构

if语句的语法结构

if接单语句的情况

if接多语句的情况

双分支

多分支

悬空else

switch语句

在switch语句中的 break

 default子句

写在最后


前言

C语言分支语句if,switch语句详细讲解篇!!!


C语言是结构化的程序设计语言

顺序结构

一般的语句就是按照的这个结构执行的。

选择结构(本篇博客所讲内容)

C语言用if,switch分支语句构成选择结构

循环结构

C语言用for,while,do..while三个语句构成循环结构。


if语句的语法结构

if接单语句的情况

if(条件表达式)

   语句;

例子:输入n,如果n等于1,打印hello

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n == 1)// = 是赋值符号,条件表达式千万不要写成单个等号!!! 相等是两个等号 ==
	printf("hello\n");
    return 0;
}

测试结果: 

说明:

if接单语句情况,满足条件表达式,就执行语句;不满足条件则不执行。

if接多语句的情况

if(条件表达式)

   {

        语句1;

        语句2;

        ....

        语句n;

   }

例子:输入n,如果n等于1,打印hello和world

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n == 1)// = 是赋值符号,条件表达式千万不要写成单个等号!!! 相等是两个等号 ==
	{
		printf("hello\n");
		printf("world\n");
	}
    return 0;
}

测试结果: 

说明:

如果if语句后面接一个代码块(一个代码块如下图所示),满足条件表达式,就执行代码块的所有内容;不满足条件则不执行。

代码块实例:(有{}花括号括起来的就是代码块

 注意:单语句可以不加{},多语句必须加上{}。(个人建议不管单语句还是多语句,最好加上{}

条件表达式一定要注意不要写单个等号!!!!!!!!!

双分支

//每个分支单语句的情况

if(条件表达式)

   语句1;

else

   语句2;

//每个分支多语句的情况

if(条件表达式)

   {

        语句1;

        语句2;

        ....

        语句n;

   }

else

  {

        语句1;

        语句2;

        ....

        语句n;

  }

例子:输入n,如果n等于1,打印hello;否则打印bingo。

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n == 1)// = 是赋值符号,条件表达式千万不要写成单个等号!!! 相等是两个等号 ==
	{
		printf("hello\n");
	}
	else
	{
		printf("bingo\n");
	}
	return 0;
}

测试结果:

说明:if else双分支的情况如果满足if的条件表达式,就执行if后面的单语句或者代码块;如果不满足if的条件表达式,则执行else后面的单语句或者代码块

注意:单语句可以不加{},多语句必须加上{}。(个人建议不管单语句还是多语句,最好加上{}

条件表达式一定要注意不要写单个等号!!!!!!!!!

多分支

//每个分支单语句的情况

if(条件表达式1)

   语句1;

else if(条件表达式2)

   语句2;

......

else

   语句n;

//每个分支多语句的情况

if(条件表达式1)

   {

        语句1;

        语句2;

        ....

        语句n;

   }

else if(条件表达式2)

  {

        语句1;

        语句2;

        ....

        语句n;

  }

....

else

  {

        语句1;

        语句2;

        ....

        语句n;

  }

说明:遇到一个分支先判断条件表达式,如果满足,则执行该分支内容,其他分支就不用判断和执行了。如果不满足,则继续往下按顺序进行判断,如果列出的所有if和else if的条件表达式都不满足,则执行else分支的内容。

注意:单语句可以不加{},多语句必须加上{}。(个人建议不管单语句还是多语句,最好加上{}

条件表达式满足时结果为真,则语句执行。

在C语言中如何表示真假?

0表示假,非0表示真。

悬空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; 
}

你以为测试结果是打印haha?其实不然,真正的结果是什么都没执行。

为什么会这样?如果没有{},else的匹配就是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; 
}

这也是为什么我建议大家无论如何都要加上{}!!!

注意:在一个if分支结构中,只能有一个else。

在一个if分支结构中,if可以单独存在。

在一个if分支结构中,可以没有else。


switch语句

switch语句也是一种分支语句。

常常用于多分支的情况。

语法:

switch(整型表达式)

{

   语句项;

}

语句项是什么呢?

case 整型常量表达式:

   语句;

说明:这里case 整型常量表达式:,冒号:的后面,可以接多条语句,不用加上花括号{}

switch语句中的 break

switch 语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支。
比如下面这个代码,没有加上break:
#include <stdio.h>
int main()
{
	int day = 0;
    scanf("%d", &day);
	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;
}

假设我们要打印星期三,我们输入3,测试结果却不是我们想象的那样。

 程序会把星期三往下的语句都打印了。

这就是没有break,switch语句的分支不能独立!!

每个case后面加上break的代码:

#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	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语句 的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

在最后一个 case 语句的后面加上一条 break语句。

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

 default子句

如果表达的值与所有的case标签的值都不匹配怎么办?

其实也没什么,结构就是所有的语句都被跳过而已。

程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。

但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?

你可以在语句列表中增加一条default子句,把下面的标签

default:

写在任何一个 case 标签可以出现的位置。

当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。

所以,每个switch语句中只能出现一条default子句。

但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

比如之前的选星期几的代码,加上default之后

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	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;
		default:
			printf("输入错误!\n");
			break;
	}
	return 0;
}

输入9的测试结果:

 编程好习惯

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


写在最后

有错误的地方希望大家指出,有问题的也可以在评论区讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值