初级C语言之【分支语句】

举报
春人. 发表于 2023/11/27 00:20:10 2023/11/27
【摘要】 一:什么是语句?C语言的语句可以分为以下五类:表达式语句函数调用语句控制语句复合语句空语句1.1:表达式语句:这就是一个表达式语句2+3;1.2:函数调用语句:就是调用了函数的那条语句就是函数调用语句1.3:控制语句:控制语句用于控制程序的执行流程,以实现程序的各种结构方式C语言支持三种结构:1、顺序结构2、选择结构3、循环结构它们由特定的语句定义符组成,C语言有九种控制语句。可分为以下三类...

一:什么是语句?

C语言的语句可以分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

1.1:表达式语句:

这就是一个表达式语句

2+3;

1.2:函数调用语句:

就是调用了函数的那条语句就是函数调用语句

1.3:控制语句:

控制语句用于控制程序的执行流程,以实现程序的各种结构方式
C语言支持三种结构:
1、顺序结构
2、选择结构
3、循环结构
它们由特定的语句定义符组成,C语言有九种控制语句。
可分为以下三类:
1、条件判断语句也叫分支语句:if语句、switch语句;
2、循环执行语句:do while语句、while语句、for语句;
3、转向语句:break语句、goto语句、continue语句、return语句。

1.4:空语句:

一个;就是一条空语句。

;

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

2.1:if语句

2.1.1:单分支

if(表达式)
    语句;

如果表达式的值为真,就执行下面的语句,否则什么也不干。

输入19,结果是成年

在这里插入图片描述

输入15,结果什么也没干

在这里插入图片描述

2.1.2:双分支

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

如果表达式的值为真,就执行语句1,否则执行语句2

输入19,结果是成年
在这里插入图片描述

输入15,结果是未成年
在这里插入图片描述

2.1.3:多分支

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

表达式1如果为真,就执行语句1,如果为假,则判断表达式2是否为真,如果为真,就执行语句2,否则就执行语句3.

2.1.4:if语句注意事项

2.1.4.1:关于大括号

if或else语句默认只能控制一条语句,如有多条语句要加大括号。这里的大括号叫做一个代码块。

举个栗子:判断年龄是否成年,并规定只有成年了才能谈恋爱。
如果把代码写成下面这样:
在这里插入图片描述

此时age=20,成年了可以谈恋爱了,程序的运行结果满足我们的预期。
但当我们输入15时,没有成年,就不能谈恋爱,所以程序应该什么都不输出才对,但实际呢??
在这里插入图片描述
输出了谈恋爱,和我们的预期结果有所不同,说明printf(“谈恋爱\n”);这条语句并没有受到if的控制,无论输入什么年龄这条语句都执行了。

将代码稍作修改,给这两条语句加上大括号,可见此时程序的运行结果满足了我们的预期。
在这里插入图片描述

2.4.1.2:else的匹配机制

大家看看下面这段代码,猜猜它的执行结果过是什么。

int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            printf("hehe\n");
    else
            printf("haha\n");
    return 0;
}

在这里插入图片描述

你是不是猜的“haha”呢?,哈哈,很抱歉你猜错了。为什么不是“haha”呢?

原因是:这里的else是和第二个if匹配的,大家不要被else的位置迷惑了,看它和第一个if对其了就以为它是和第一个if匹配。else是就近匹配,和离他最近的那个if匹配。

上面这段代码就等价于下面这段代码:

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括起来,这时大家是不是就看的很明白了呢?可见养成一个良好的代码风格是十分重要的。
我们还可以通过加大括号让这个else和第一个if匹配。代码如下:

int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
    {
        if (b == 2)
            printf("hehe\n");
    }
    else
        printf("haha\n");
        
    return 0;
}

此时代码打印的结果就是“haha”了。
在这里插入图片描述

2.4.1.3:两段代码的对比

int main()
{
	int a = 1;
	if (a)
	{
		return 1;
	}
	return 2;
}
int main()
{
	int a = 1;
	if (a)
	{
		return 1;
	}
	else
	{
		return 2;
	}
}

上面这两段代码要表达的意思和执行的结果都是一样的,如果表达式a为真就返回1,否则就返回2。第一段代码很可能会误解人,所以我们一定要注意代码风格,让人容易理解。

2.1.4.4:表达式的书写细节

int main()
{
	int num = 0;
	if (num == 10)
	{
		printf("hehe\n");
	}
	return 0;
}

此时我们希望当num等于10的时候程序可以输出“hehe”,显然这里num是0就不会输出“hehe”,这时如果当我们把if后面的表达式 num== 10不小心漏掉了一个等号,写成 num=10,此时代码的运行结果是怎样的呢?我们不妨上机试试。
在这里插入图片描述
此时程序不仅没有报错,还打印出了“hehe”,不符合我们的预期。出现这种情况的原因是:num = 10;是一条赋值语句,此时num被赋为10,非0为真,为真的话就会执行if后面的语句。那如何避免这种情况的出现呢?

我们可以把 num == 10; 写成 10 == num;这两条语句表达的意思和执行的结果都是一样的,都是判断num是否等于10.这样写当我们不小心少写一个=的时候,程序就会报错提醒我们。
在这里插入图片描述

比较一个变量和一个常量是否相等的时候,建议把常量放在等号的左边

2.1.5:练习

2.1.5.1:判断奇偶数

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)
	{
		printf("是奇数\n");
	}
	else
	{
		printf("是偶数\n");
	}
	return 0;
}

注意这里不需要把“num % 2 == 1”写成“1 == num%2”,因为这里的“num % 2”是一个表达式,如果我们把“num % 2 == 1”的等号漏掉了一个,代码是编译不过去的。

2.1.5.2:输出1~100之间的奇数

int main()
{
	int i = 1;
	while (i <= 100)
	{
		if (i % 2 == 1)
		{
			printf("%d ", i);
		}
		i++;
	}
	return 0;
}

还可以这样来写,下面没有用到if来进行判断,而是用到了算法,奇数之间相差2,最初我们让i=1,此后每次让i加2就可以把1~100的所有奇数打印出来。上面的代码会执行100次循环,而下面的代码只会执行50次循环并且没有判断,效率会大大提高。

int main()
{
	int i = 1;
	while (i <= 100)
	{
		printf("%d ", i);
		i += 2;
	}
	return 0;
}

2.2:switch语句

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

  • 输入1,输出星期一
  • 输入2,输出星期二
  • 输入3,输出星期三
  • 输入4,输出星期四
  • 输入5,输出星期五
  • 输入6,输出星期六
  • 输入7,输出星期日

此时如果我们写成if else语句的话就十分繁琐。这时我们就可以用上switch语句,代码如下:如果day是3,就执行case 3:下面的printf,然后通过break跳出这个switch。如果day是5,就执行case 5:下面的printf,然后通过break跳出这个switch。

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

2.2.1:注意break关键字的使用

需要注意的是,这里的case仅仅是选择分支的入口,比如当day等于3的时候,程序会从case 3: 这个入口进去,执行后面的语句,break就是出口,当执行到break的时候,程序会跳出switch,如果没有这个switch会发生什么结果呢?让我们来试试:

在这里插入图片描述
可见,去掉break后,我们再输入3,程序把星期三~星期天都打印出来了。原因就是这里没有break,当输入3后,程序从case 3: 这个入口进去,执行完 “printf(“星期三\n”);”后,没有让其停下来的语句,此时就会接着往后执行,直到输出星期天为止。

case决定入口,break决定出口。

2.2.2:default子句

这时又有一个新的问题,当我们输入8的时候,没有与之匹配的case。这时该怎么办呢?
按照上面的代码,输入8后什么结果也不会有,如果想对其进行提示,告诉他输错了,该怎么办呢?此时就要用到我们的default了。

default就是当所有的case都不匹配的时候,就会执行default后面的子句。

在这里插入图片描述

switch语句里面的case和default只要逻辑上是对的,他们没有顺序可言,也就是说可以随便交换两个case的位置都不会对程序造成任何影响。但习惯上我们会把default子句放在最后面

2.2.3:switch语句的语法要求

  • switch后面括号里的表达式必须是一个整形表达式
switch(整型表达式)
{
    语句项;
}

在这里插入图片描述

我们定义一个浮点型变量f,让它=1.2,然后把它放进switch后面的括号里去,这时程序就会报错了。

  • case 后面必须是整型常量表达式

比如我们可以把“ case 2:”写成“ case 1 + 1:”这样也是可以的,但千万不能是变量。

在这里插入图片描述

这里我们定义了一个变量n让它等于2,然后把这个n放到case后面,这时程序就会报错。

2.2.4:case后面不一定需要break

如果我们希望输入1-5的时候程序输出工作日,输入6-7的时候程序输出休息日,正常思路我们会把代码写成下面这样:

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");
        default:
            printf("选择错误\n");
            break;
    }    
    return 0;
}

但其实我们还有一种更好的方法,就是把代码写成下面这样:

int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("工作日\n");
            break;
        case 6:
        case 7:
            printf("休息日\n");
        default:
            printf("选择错误\n");
            break;
    }    
    return 0;
}

当day为1-5中的任何一个数字,程序从相应的case入口进去后,就比如当程序从case 3:进去后,由于没有break暂停跳出,程序会一直往下执行,当执行完case 5:中的 printf(“工作日\n”);后,遇到了break,此时程序就会跳出switch。此时代码就显得十分简洁。

当多个case要执行同一条语句的时候,就可以按照上面的方法去写代码。

2.2.5:练习

大家可以看看下面这段代码,判断一下程序的结果是什么。

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

在这里插入图片描述

结果是m = 5, n = 3,你有没有作对呢?其实只要注意break,这道题是很容易作对哒。break只会跳出本次所在的switch。另外,switch是可以嵌套的。

今天就分享到这里啦,喜欢的话可以点赞、评论和收藏哟!

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。