初级C语言之【分支语句】(二)

简介: 初级C语言之【分支语句】(二)

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,此时代码的运行结果是怎样的呢?我们不妨上机试试。


6c828a77826f413d889ba292d4290725.png此时程序不仅没有报错,还打印出了“hehe”,不符合我们的预期。出现这种情况的原因是:num = 10;是一条赋值语句,此时num被赋为10,非0为真,为真的话就会执行if后面的语句。那如何避免这种情况的出现呢?

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

41c0f75278c94f9c92022efff806feef.png

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

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会发生什么结果呢?让我们来试试:

1a45d274aa2e4a188372a4452a76bc7f.png


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

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

2.2.2:default子句

这时又有一个新的问题,当我们输入8的时候,没有与之匹配的case。这时该怎么办呢?

按照上面的代码,输入8后什么结果也不会有,如果想对其进行提示,告诉他输错了,该怎么办呢?此时就要用到我们的default了。

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

0f56757fab3a4de3855d9c4d28995fe3.png

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


2.2.3:switch语句的语法要求

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

bc48a2e37cf94899951cc1da39b6c824.png

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

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

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

5c2d8d4036a74840b090931380d84abb.png

这里我们定义了一个变量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;
}

3edac8551d264200b22df73d96ed192f.png

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

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

9cef4f5a4f8d409ab885c911f3600a47.png

目录
相关文章
|
2月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
78 5
|
2月前
|
C语言
【c语言】分支语句
C语言通过三种基本结构——顺序、选择和循环,构建复杂的程序逻辑。本文主要介绍了C语言的选择结构,即if-else语句及其变体,包括简单的if语句、if-else组合、else if多分支判断、嵌套if以及解决悬空else问题的方法。此外,还详细讲解了逻辑运算符和关系运算符的使用,以及如何利用条件操作符简化逻辑判断。最后,文章对比了if-else与switch语句在实现多分支逻辑时的应用,并解释了switch语句中的break和default关键字的作用。
33 8
|
7月前
|
C语言 数据安全/隐私保护
C语言初阶②(分支语句和循环语句)编程练习
C语言初阶②(分支语句和循环语句)编程练习
61 1
|
2月前
|
Serverless C语言
C语言控制语句:分支、循环和转向
C语言控制语句:分支、循环和转向
|
6月前
|
C语言
【C语言基础】:分支与循环
【C语言基础】:分支与循环
|
2月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
|
2月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
19 0
|
2月前
|
程序员 C语言
【C语言】分支语句(逻辑运算符与关系运算符)
【C语言】分支语句(逻辑运算符与关系运算符)
|
4月前
|
C语言
【C语言篇】分支语句详解(超详细)
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要顺序是满⾜实际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。
60 2
|
4月前
|
C语言
C语言分支语句
C语言分支语句
33 4