C语言入门之分支语句

本文详细介绍了C语言中的分支结构,包括顺序结构、分支结构(if-else和switch)以及它们的嵌套使用,展示了如何通过if和switch判断奇数、偶数、整数的正负以及除法余数,同时强调了正确使用括号和break的重要性。
摘要由CSDN通过智能技术生成

前言

首先,C语言是结构化的程序设计语言,这里的结构是指顺序结构,选择/分支结构,循环结构,这仔细想想就能发现和我们日常所遇到的事情都可以分为三种或者三种的组合。

顺序结构

顾名思义就是从开始到结束,依次的进行下去。

分支结构

我们可以用 if ,switch来实现。

循环结构

我们可以用 while , for , do while 来实现。

正文

if语句

if语句的表示形式如下

if(表达式)
    语句;

如果条件为真,就执行 if 语句 ,反之则不执行。

C语言的真与假

在C语言中,0表示假,非0表示真,也就是说如果表达式不为零,if语句就执行,如果为零,if语句不执行。

有了这一基础,就可以看下面的例一。

例一 判断奇数

#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m % 2 == 1)//如果是奇数,进入if语句 , 如果不是,跳过if语句
        printf("奇数\n");
    return 0;
}

else 

如果一个数不是奇数,那就是偶数。如果一个数,我们想判断这个数是奇数还是偶数该怎么表达呢?

就是用 if ...... else的语句就可以完成这个任务

if ...... else 的语句形式如下

if(表达式)

        语句1;

else

        语句2;

例二 输入整型,判断奇数还是偶数
#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m % 2 == 1)//m % 2 == 1,进入if语句
        printf("奇数\n");
    else          //m % 2 != 1,进入else语句
        printf("偶数\n")
    return 0;
}

 分支控制多条语句

if 和 else语句在无其他条件下,默认只会控制一条语句,例如:

#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
   if(m < 18)
    printf("未成年\n");
    printf("不建议谈恋爱");
    return 0;
}

运行结果如下

可以看到不管我输入的值是否大于18, printf("不建议谈恋爱"); 都会执行,这是因为if默认只会控制 printf("未成年");这条语句,如果条件为真,执行,如果条件为假,不执行。但是 printf("不建议谈恋爱"); 是一个独立的语句,不管我们的 if 语句是否被执行,它都会执行。

那我们如果要同时控制两条甚至更多的语句该怎么实现呢? 那我们就要使用 {} 将代码括起来,else后也可以使用 {}  如下:

#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m < 18)
    {
        printf("未成年\n");
        printf("不建议谈恋爱\n");
    }
    else
    {
        printf("成年\n");
        printf("自由恋爱\n");
    }
    return 0;
}

运行结果如下:

嵌套if 

在if ...... else 语句中,else还可以与另一个if进行连用,构成多重判断

例三 要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数
#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m == 0 )
    {
        printf("m为%d\n", m);
    }
    else if( m < 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
    {
        printf("m为负数\n");
    }
    else
    {
        printf("m为正数\n");
    }
    return 0;
}

运行结果如下:

再比如 

例四 输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:负数
#include<stdio.h>
int main()
{
    int m = 0;
    scanf("%d", &m);
    if(m > 0 )
    {
        if(m % 2 == 0)
            printf("m为偶数\n");
        else
            printf("m为奇数\n");
    }
    
    else
    {
        printf("m为负数\n");
    }
    return 0;
}

运行结果如下

以上就是if的嵌套语法,我们有了if的嵌套,就可以以完成更多复杂逻辑的判断。

悬空else

如果有多个 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
         printf("haha\n");
     return 0;
}

运行的结果是什么?

 我们很多初学者,上来以判断 a 是 0,不等于 1 ,那就执⾏ else 语句,打印 haha 但是当你去运行代码,输出的结果是:啥都不输出。

结果

这是为什么呢?

这就是悬空else的问题了,

上面的代码排版是将 else 和第一个 if 对其了,让我们误以为 else 是和第一个 if 匹配的,当 if 语句不执行,自然而然执行的是 else 语句,打印 haha,实则 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;
}

 如果想和第一个 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;
}

 适当的加入一些大括号{},可以使我们的代码更清晰,可读性更高,所以我们以后在写代码的时候多注意括号使用。

switch语句

switch语句是一种特殊的if......else语句,用于判断多结果的情况,它将多次的else if改成了更简单易懂的形式

switch的语法形式

switch(表达式)
{
    case value1: statement//如果表达式结果为value1,执行该语句
    case value2: statement//如果表达式结果为value2,执行该语句
    default: statement    //如果表达式结果既不是value1也不是value2,执行该语句
}
注意

1. switch后的表达式必须是整型表达式

2. case后的值必须是整型常量表达式

 if语句和switch语句相对比

例五 输入一个整数,计算除3之后的余数
如果使用的是if语句,如下
#include<stdio.h>
//输入一个整数,计算除3之后的余数
int main()
{
	int x = 0;
	scanf("%d", &x);
	if (x % 3 == 0)
		printf("x除3之后的余数是0");
	else if (x % 3 == 1)
		printf("x除3之后的余数是1");
	else
		printf("x除3之后的余数是2");
	return 0;
}
 switch语句
#include<stdio.h>
int main()
{
	int x = 0;
	scanf("%d", &x);
	switch (x % 3)
	{
	case 0:
		printf("x除3之后的余数是0");
	case 1:
		printf("x除3之后的余数是1");
	case 2:
		printf("x除3之后的余数是2");
	}
	return 0;
}

switch运行的结果

这是为什么呢?

因为switch语句中的case语句只是决定了程序的入口,决定不了出口,如果代码没有遇到其他情况的话,会从入口一直运行到switch的结尾。

那么这个其他情况是什么呢?

就是在case语句的末尾加break语句,意思就是代码运行到break语句的时候跳出switch语句(相当与case语句的出口) 

所以改良后的switch语句是这样的
#include<stdio.h>
int main()
{
	int x = 0;
	scanf("%d", &x);
	switch (x % 3)
	{
	case 0:
		printf("x除3之后的余数是0\n");
		break;
	case 1:
		printf("x除3之后的余数是1\n");
		break;
	case 2:
		printf("x除3之后的余数是2\n");
		break;
	}
	return 0;
}

运行结果如下

 根据以上代码,我们需要注意的点如下

1. case语句和后面的整型常量表达需要“空格”

2. case语句执行完后,需要在末尾加break语句,这样才能跳出switch语句

switch中的default语句

我们在switch语句经常会遇到一种情况,就是switch表达式值无法匹配case语句的时候,要么就不处理,要么就加一个default语句

switch(表达式)
{
    case value1: statement//如果表达式结果为value1,执行该语句
    case value2: statement//如果表达式结果为value2,执行该语句
    default: statement    //如果表达式结果既不是value1也不是value2,执行该语句
}

switch语句中case和default的顺序关系

switch语句中的case和default一定有顺序关系吗,default一定在case后面吗?

其实,并没有顺序关系,只是为了代码的可读性和美观通常是放在语句的末尾的。

结尾

以上就是分支语句的全部知识了,在文中有出现“==”,“<”这些运算符我也会在后期发一篇文在专门讲运算符。

如果文中有问题,欢迎大家指出,我会及时改正!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值