【C语言】 分支语句(选择结构)-- if语句 -- switch语句

简介: 【C语言】 分支语句(选择结构)-- if语句 -- switch语句

前言:

在我们生活中,无论做什么事,都是存在结构化的,分为顺序结构,选择结构,循环结构,要不是其中一种,要不就是多种有机组合。
顺序结构:从头做到尾,环环相扣。

选择结构:从头开始,遇到选择后就分支。

循环结构:没头没尾,从开始做就一直做下去。

而C语言就可以将这三种结构描述出来,所以我们称C语言是结构化的程序设计语言。

什么是语句?

C语言语句可以分为5种:

1.表达式语句。举例:2+3;


2.函数调用语句。举例:调用add函数,add();3.控制语句。本节讲解。


4.复合语句。


5.空语句。就是单单一个;


控制语句用于控制程序执行的流程,以实现程序的各种结构方式(C语言支持三种:顺序结构,选择结构,循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。


可以分为三类:


1.条件判断语句也叫分支语句:if语句、switch语句;


2.循环执行语句:do while语句、while语句、for语句;


3.转向语句:break语句、goto语句、continue语句、return语句。

1.分支语句(选择结构)

1.1 if语句

语法结构:
//单分支

if(表达式)//表达式为真(C语言中,0为假,非0为真),执行下面的语句,为假不执行

       语句;//这里的语句如果是一条可以不用{}括起来,多条的时候用{}括起来,一个{}是一个代码块,里面就是语句列表

//双分支

if(表达式) //表达式为真,执行语句1,表达式为假,执行语句2

       语句1;

else

       语句2;

//多分支

if(表达式1) //表达式1为真,执行语句1,为假,执行语句2

       语句1;

else if(表达式2)//表达式1为假,就会进入此分支,判断表达式2是否为真,为真执行语句2,为假进入else,执行语句3

       语句2;

else if(表达式*)//不断判断真假,对应是否执行,是否跳向下一组分支

       语句*;

else

       语句3;

代码演示:

#include <stdio.h>
//分支语句
int main()
{
  int age = 0;
  scanf("%d", &age);
  //输入
  //单分支
  /*if (age < 18)
    printf("未成年\n");*/
  //双分支(只会执行其中一条)
  /*if (age < 18)
  {
    printf("未成年\n");
    printf("不能吸烟\n");
  }
  else
  {
    printf("成年\n");
  }*/
  //多分支(只会执行其中一条)
  if (age < 18)
  {
    printf("未成年\n");
  }
  //else if (18 <= age < 30)//这()里面的表达式不是正确的,这里执行的是18 <= age这条,输入的值大于等于18就会执行
  //{
  //  printf("成年\n");
  //}
  //改正
  else if (18 <= age && age < 30)
  {
    printf("青年\n");
  }
  else if (30 <= age && age < 60)
  {
    printf("中年\n");
  }
  else if (60 <= age && age < 90)//如果这里的数据是严丝合缝的,那么&&前面的语句是可以去掉的,如果不是就不可以去掉
  {
    printf("老年\n");
  }
  else
  {
    printf("老寿星\n");
  }
  return 0;
}

1.1.1 悬空else

在代码中排版很重要,要规范写代码。

{ }的使用可以使代码的可读性提高,建议使用。

代码演示:

#include <stdio.h>
int main()
{
    //这个代码什么都不会输出,条件判断的时候是假,不会进入
  //int a = 0;
  //int b = 2;
  //if (a == 1)
  //  if (b == 2)
  //    printf("hehe\n");
  //else//注:在没有{}的情况下,else跟离自己最近的if匹配(这里的else跟打印hehe的if匹配)。所以代码的排版很重要
  //  printf("haha\n");
  //这样的排版才是合理的
  /*int a = 0;
  int b = 2;
  if (a == 1)
    if (b == 2)
      printf("hehe\n");
    else
      printf("haha\n");*/
  //或者
  int a = 0;
  int b = 2;
  if (a == 1)
  {
    if (b == 2)
      printf("hehe\n");
  }
  else//这个else与if (a == 1)进行匹配,因为上一个if是代码块中的
  {
    printf("haha\n");
  }
  return 0;
}

1.1.2 if书写形式的对比

举例://代码1


这个代码实现进行条件判断,如果条件为真,就返回x,如果条件为假,继续往下执行,返回y。

if (condition)
{
        return x;
}
retrun y;

//代码2


这个代码和代码1是一样的,但是这个使用了{ },可读性高。

if (condition)
{
        return x;
}
else
{
        retrun y;
}

//代码3

int num = 0;
if(num == 5)
        printf("hehe\n");


//代码4

int num = 0;
if(5== num)
        printf("hehe\n");


代码3和代码4进行对比。代码3,f(num == 5)万一少一个等号就变成了赋值语句,编译器不报错,但是改变了代码的本意。对比代码4,if(5== num)万一少一个等号就会报错。这样可以避免失误。这个技巧用于常量与变量对比,表达式与常量不用这样写,少写一个等号就会提示出来。


代码2和代码4更好,逻辑更加清晰,可读性高。

1.1.3 练习

(1)判断一个数是否为奇数

#include <stdio.h>
int main()
{
  int n = 0;
  scanf("%d", &n);
  //判断
  if (n % 2 == 1)//这里的前后换不换是一样的,因为这里的是表达式,如果丢一个=代码是编不过去的
    printf("奇数\n");
  return 0;
}

(2) 输出1~100之间的奇数

#include <stdio.h>
int main()
{
  //法一:
  /*int i = 1;
  while (i < 100)
  {
    if (i % 2 == 1)
      printf("%d ", i);
    i++;
  }*/
  //法二(这个代码是有规律的,所以这样可以,这个代码的效率比法一高)
  int i = 1;
  while (i < 100)
  {
    if (i % 2 == 1)
      printf("%d ", i);
    i+=2;
  }
  return 0;
}

1.2 switch语句

switch语句也是一种分支语句,常常用于多分支情况。

语法:
switch(整形表达式)

{

case 整型常量表达式:

       语句;

       break;

default:

       语句;

       break;

}

1.2.1 switch语句重点内容注意点及代码举例


case:case(),括号里面必须是整型常量表达式,语句后面可以写多个语句,用{}括起来就可以合法使用。case语句是没有顺序的要求,只要能正常处理问题就行,按照逻辑来讲先处理合法在处理不合法。


break:如果case语句没有加break,代码会一直往后走,直到跑完整个代码或者遇见break结束,加上break才会在打印完跳出循环。


default:如果代码在执行的时候没有跟任何一个case语句匹配,就会走default语句。default语句是处理非正常语句,可以放在任何可以合法放case语句的地方。

例:

输入1~7其中一个数,输出对应的星期几

方法1:

#include <stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  if (1 == day)
    printf("星期一\n");
  else if (2 == day)
    printf("星期二\n");
  else if (3 == day)
    printf("星期三\n");
  else if (4 == day)
    printf("星期四\n");
  else if (5 == day)
    printf("星期五\n");
  else if (6 == day)
    printf("星期六\n");
  else if(7 == day)
    printf("星期天\n");
  return 0;
}

方法2:

#include <stdio.h>
int main()
{
  int day = 0;
  scanf("%d", &day);
  switch (day)//注:()里面必须是整形表达式
  {
  case 1://注:case后面必须是整型常量表达式
    printf("星期一\n");//case语句后面可以写多个语句,用{}括起来就可以合法使用
    break;//如果没有break,代码还会往后走,直到遇见break结束或者跑完整个代码,加上break才会在打印完跳出循环
  case 2://case语句是没有顺序的要求,只要能正常处理问题就行,按照逻辑来讲先处理合法在处理不合法
    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语句,理论上这个break是可以省略的,但是如果将来另外的人接手这个代码,
        //给后面再加一个case语句遗漏了这个break,就会出现bug(职业素养问题)
  default://如果输入的数字都无法跟前面的case语句匹配,就会走这个语句,处理非正常语句
    printf("输入错误\n");
    break;
  }
  return 0;
}

举例:

如果输入1~5输出工作日,6、7输出休息日

#include <stdio.h>
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");
    break;
  default:
    printf("输入错误\n");
    break;
  }
  return 0;
}

1.2.2 练习(读代码给出结果)

#include <stdio.h>
int main()
{
  int n = 1;
  int m = 2;
  switch (n)
  {
  case 1:m++;
  case 2:n++;
  case 3:
    switch (n)
    {
    case 1:n++;
    case 2:
    {
      m++;
      n++;
      break;
    }
    }
  case 4:
    m++;
  default:
    break;
  }
  printf("m = %d, n = %d", m, n);
  return 0;
}

答案:m = 5,n = 3

相关文章
|
2月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
71 5
|
25天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
63 16
|
2月前
|
C语言
【c语言】分支语句
C语言通过三种基本结构——顺序、选择和循环,构建复杂的程序逻辑。本文主要介绍了C语言的选择结构,即if-else语句及其变体,包括简单的if语句、if-else组合、else if多分支判断、嵌套if以及解决悬空else问题的方法。此外,还详细讲解了逻辑运算符和关系运算符的使用,以及如何利用条件操作符简化逻辑判断。最后,文章对比了if-else与switch语句在实现多分支逻辑时的应用,并解释了switch语句中的break和default关键字的作用。
31 8
|
2月前
|
Serverless C语言
C语言控制语句:分支、循环和转向
C语言控制语句:分支、循环和转向
|
2月前
|
编译器 C语言 Python
C语言结构
C语言结构
17 0
|
2月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
17 0
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
36 3
|
18天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6
|
1天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
19 6