『C语言从入门到进阶』第 ① 期 - 分支语句

简介: 『C语言从入门到进阶』第 ① 期 - 分支语句

image.png

目录


什么是语句

什么是分支语句

if语句

语法结构

else if

悬空else

switch语句

语法结构


文章导读


本篇文章主要内容为学习C语言中的分支语句——if语句与switch语句。介绍了什么是语句、if语句的语法结构、悬空else、switch的语法结构等。


正文


什么是语句


C语言中,一条指令、一行代码都可以称为语句,每条语句是以分号;来进行分隔的。


语句可分为以下五类:


表达式语句

函数调用语句

控制语句

复合语句

空语句

本章将要学习的分支语句属于控制语句的一种。控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句,可分成以下三类:


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


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


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


什么是分支语句


分支源于选择。正因为有多种不同的选择,才会产生不同选择所造成的结果。


如果你好好学习,毕业年薪百万,走上人生巅峰;如果你不学习,毕业等于失业,回家卖红薯。


是否好好学习就是选择,年薪百万与回家卖红薯就是不同的分支。


C语言中,我们经常使用if语句与switch语句实现选择与分支。


if语句


语法结构


//语法结构:
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;
  • if后面的()中的表达式为条件判断的表达式,若表达式为真,则执行语句;若表达式为假则不执行;
  • C语言中,0表示假非0表示真

用法示例

int main()
{
  int a = 1;
  if (a == 1)
  {
    printf("YES");
  }
  else
  {
    printf("NO");
  }
  return 0;
}

20.png


else if


如果我们需要实现很多选择的情况,可以利用else if来实现,意为否则。

int main()
{
  int a = 1;
  if (a == 1)
  {
    printf("a=1");
  }
  else if(a>1)
  {
    printf("a>1");
  }
  else//对应a<1的情况
  {
    printf("a<1");
  }
  return 0;
}


悬空else


初学者经常会犯的错误就是悬空else,也是学校测试喜欢考察的内容,例如,这就是一道非常经典的悬空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;
}

解答: 运行结果为没有输出内容

为什么会这样呢?因为语法规定else与和它相距最近if相匹配。第一个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;
}

当我们不注重代码的书写规范时,我们难免会出现这样的bug,而且这种bug往往是最难发现的,编译器并不知道我们的代码想要表达的意思,它只要觉得代码符合语法规范就不会报错。而且就算是我们肉眼寻找也极难发现,当然我们也有很好的办法来避免它,那就是,不要偷懒,多使用{}


switch语句


switch语句同样也是一种分支语句,它能应对比if语句更复杂的场景。


语法结构


直接来看示例:

int main()
{
  int a = 1;
  switch (a)
  {
  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;
  default:
    printf("周末\n");
    break;
  }
  return 0;
}

如上所示,switch语句,经常由switch、case、break、defaul构成。


switch:switch后面的()中的内容为一个整型表达式;

case:case意为情况,case后面的值为整型表达式的可能取值;如果表达式的值为这个可能取值,则执行:后面的语句。

break:当我们执行完一种情况,而不想在继续往下执行,我们就需要用break来跳出switch。

default:意为否则,作用是,若上述的case都不符合可能取值,则执行default的语句。

灵活的运用breakdefault可以应对很多不同的场景。例如:

int main()
{
  int a = 1;
  switch (a)
  {
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
    printf("工作日\n");
    break;
  default:
    printf("周末\n");
    break;
  }
  return 0;
}

注意

  • 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
  • 每个 switch 语句中只能出现一条default子句
  • 可以写在任何一个 case 标签可以出现的位置,不一定是末尾。
目录
相关文章
|
18小时前
|
编译器 C语言 C++
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(下)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
6 0
|
18小时前
|
存储 安全 编译器
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(下)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
4 0
|
18小时前
|
存储 编译器 C语言
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(中)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
4 0
|
18小时前
|
自然语言处理 编译器 C语言
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(上)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
9 0
|
18小时前
|
编译器 C语言 C++
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
5 0
|
18小时前
|
Java 编译器 C#
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(上)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
11 0
|
1天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
6 0
|
1天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
9 0
|
1天前
|
程序员 编译器 C语言
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(中)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
11 0
|
1天前
|
存储 程序员 编译器
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(上)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
10 0