zoukankan      html  css  js  c++  java
  • C语言学习-选择结构if语句、switch语句

    今天主要学习了,if语言和switch语句,下面直接进入正题。
    C语言为我们提供了3种流程控制结构,分别为:顺序结构,选择结构,循环结构。

    顺序结构:默认的流程结构。按照书写顺序执行每一条语句。

    选择结构:对给定的条件进行判断,根据不同的结果执行不同的代码断。

    循环结构:对给定条件成立的情况下,反复执行某一代码断。

    3种流程图如下:

    一、顺序结构

    1 int main(){
    2 
    3      printf("hello world!
    ");
    4      
    5      printf("I like iOS!
    "); 
    6 
    7      return 0;
    8     
    9 }

    以上程序的运行结果如下:

    二、选择结构

    C语言中选择结构的实现方式有两种:if语句和switch语句。先来看下if语句的使用,而if语句的形式是有好多种的。

    先来看看if语句最简单的形式

    if ( 条件 )
    {
        语句1;
        语句2;
        ....
    }

    如果if右边小括号()中的条件成立,也就是为“真”时,就会执行第2~6行大括号{}中的语句;如果条件为假,就不执行大括号{}中的语句。这里的if是关键字。

    例如:

     1 int main(){
     2 
     3      int a = 7;
     4 
     5      if ( a ){
     6          printf("条件a成立
    ");
     7          printf("a的值为真");
     8      }
     9 
    10 }

    C语言规定所有非0值都为“真”,而a的值是7,因此第3行的条件是成立的,接着就会执行第5、6行代码。输出结果如下:

    条件a成立
    a的值为真

    如果将a的值改为0,那么第3行的条件就不成立,就不会执行第5、6行代码

    语句嵌套if

     1 int main(){
     2 
     3     int a = 7;
     4 
     5     if ( a > 0 ){
     6 
     7         printf("a的值大于0
    ");
     8     
     9         if ( a<9 ){
    10 
    11            printf("a的值小于9");
    12         }
    13     }
    14 }

    第3行的a>0是成立的,因此会按顺序执行第4~11大括号中的代码。执行到第7行的时候,a<9也是成立的,因此会执行第9行代码。输出结果:

    使用注意1

    有些人习惯写完一行代码就在后面加个分号";",于是写if语句的时候,他们可能会这样写:

    1 int main(){
    2 
    3      int a = 6;
    4      if ( a>8 );
    5     {
    6         printf("a大于8");
    7      }
    8 }

    如果第4行尾部的分号,其实一个分号也是一条语句,这个叫做“空语句”。第4行的a>8不成立,所以不会执行后面的“空语句”。而后面的大括号{}跟if语句是没有联系的,因此会正常执行,于是会看到输出:

    a大于8

    所以要非常小心,千万不要在if的小括号后面添加分号。

    第5~7行的内容是一个独立的“代码块”:

    使用注意2

    下面的写法从语法的角度看是对的0:

    1 int a = 10;
    2 
    3 if (a = 0) {
    4     printf("条件成立");
    5 } else {
    6     printf("条件不成立");
    7 }

    上述代码是完全合理的,编译器不会报错,只是个警告而已。因为a为0,所以为"假",输出结果是:"条件不成立"

    这里隐藏着很大的陷阱在:

    假设你本来是想判断a是否为0,那么本应该写if (a == 0),若你误写成了if (a = 0),那将是一件非常可怕的事情,因为编译器又不报错,这样的BUG就难找了。因此,像a==0这样的表达式,最好写成0==a,若你误写成0=a,编译器会直接报错的。

    // 不推荐
    if (a == 0) {
    }
    
    // 推荐
    if (0 == a) {
    }

    使用注意3

    在C语言中,可以不保存关系运算的结果。因此,下面的写法是合法的:

    1 int a = 10;
    2 a > 10;
    3 a == 0;

    这里又是一个陷阱,假设你的本意是想给a赋值为0,那么本应该写a = 0; ,若你误写成a == 0; ,那将又是一个非常难找的BUG,因为编译器根本不会报错。在1993年的时候,这个BUG差点让一桩价值2000万美元的硬件产品生意告吹,因为如果这个BUG不解决,这个产品就没办法正常使用。

    if还可以跟关键字else一起使用

    1 if ( 条件 )
    2 {
    3     语句1;
    4 }
    5 else
    6 {
    7     语句2;
    8 }

    如果条件成立,就会执行if后面大括号{}中的语句;如果条件不成立,就会执行else后面大括号{}中的语句。总之,两个大括号中一定会有1个被执行,而且只能执行的1个。

    为了减少代码行数,你也可以写成下面的格式:

    if (条件){
         语句1;
     } else {
         语句2;  
     }

    当然,也可以省略大括号,写成下面的格式:

    1 if (条件)
    2    语句1;
    3 else 
    4    语句2;

    如果条件成立,就执行if后面的第1条语句;如果条件不成立,就执行else后面的第1条语句。但还是不建议省略大括号{}。

    例如

    1 int a = 10;
    2 if ( a==0 ) {
    3     printf("a等于0");
    4 } else {
    5     printf("a不等于0");
    6 }

    第2行的a==0不成立,所以会执行第5行代码,输出结果:

    a不等于0

    if和else还有一种比较复杂的用法

     1 if ( 条件1 )
     2 {
     3     语句1;
     4 }
     5 else if ( 条件2 )
     6 {
     7     语句2;
     8 }
     9 else if ( 条件3 )
    10 {
    11     语句3;
    12 }
    13 ...
    14 else
    15 {
    16     其他语句;
    17 }
    • 如果条件1成立,就执行条件1后面大括号{}中的内容:第2~4行
    • 如果条件1不成立,条件2成立,就执行条件2后面大括号{}中的内容:第6~8行
    • 如果条件1、条件2都不成立,条件3成立,就执行条件3后面大括号{}中的内容:第10~12行
    • 第13行的...表示可以有无限个else if
    • 如果所有的条件都不成立,就会执行else后面大括号{}中的内容:第15~17行

    注意:这么多大括号中,只有1个大括号内的代码会被执行。跟之前一样,所有的大括号都可以省略,但是不建议省略。必要的时候,最后面的else那一段(第14~17行)是可以省略的。

     1 int main(){
     2 
     3      int a = 10;
     4      if ( a==0 ) {
     5         printf("a等于0");
     6      } else if( a>0 ) {
     7          printf("a大于0");
     8      } else {
     9          printf("a小于0");
    10      }
    11    return 0;
    12 }

    第4行中的a==0不成立,接着会检查第6行。第6行的a>0成立,因此会执行第7行代码。输出结果:

    a大于0

    如果a的值是负数,那么第4、6行的条件都不成立,于是就会执行第9行代码。

    选择结构2-switch语句

     1 switch(整型表达式)
     2 {
     3     case 数值1:
     4         语句1;
     5         break;
     6     case 数值2:
     7         语句2;
     8         break;
     9     ... ...
    10     case 数值n:
    11         语句n;
    12         break;
    13     default :
    14         语句n+1;
    15         break;
    16 }
    • 当整型表达式的值等于“数值1”时,就会执行“语句1”,后面的break表示退出整个switch语句,也就是直接跳到第16行代码;
    • 当整形表达式的值等于“数值2”时,就会执行“语句2”;后面的以此类推。如果在数值1~数值n中,没有一个值等于整型表达式的值,那么就会执行default中的语句n+1。
    • 由于所有的case后面都有个break,因此执行完任意一个case中的语句后,都会直接退出switch语句
     1 int main(){
     2  
     3      int inputNum = 4;
     4     
     5       switch (inputNum) {
     6           case 1:
     7               printf("Spring
    ");
     8               break;
     9          case 2:
    10              printf("summer
    ");
    11              break;
    12          case 3:
    13              printf("autumn
    ");
    14              break;
    15          case 4:
    16              printf("winter
    ");
    17              break;
    18              
    19          default:
    20              break;
    21      }
    22  }

    因为inputNum的值刚好等于第15行case后面的4,所以会执行第16行代码,输出结果:

    winter

    break

    break关键字的作用是退出整个switch语句。默认的格式中,每个case后面都有个break,因此执行完case中的语句后,就会退出switch语句。

    1> 如果某个case后面没有break,意味着执行完这个case中的语句后,会按顺序执行后面所有case和default中的语句,直到遇到break为止

     1 int a = 0;
     2   
     3   switch (a) {
     4       case 0:
     5           printf("这是一个0
    ");
     6       case 5:
     7           printf("这是一个5
    ");
     8       case 10:
     9           printf("这是一个10
    ");
    10          break;
    11      default:
    12          printf("什么也不是
    ");
    13          break;
    14  }
    • 由于变量a的值等于第4行case后面的0,因此肯定会执行第5行代码。
    • 由于case 0中没有break语句,就不会退出switch语句,继续往下执行代码。
    • 由于a的值已经等于第4行case的值,接着不会再判断a的值是否等于其他case的值了,直接按顺序执行第7、9行代码。在第10行有个break,接着就会退出switch语句。
    • 输出结果为:
    这是一个0
    这是一个5
    这是一个10

    如果把a的值改为5,输出结果为:

    这是一个5
    这是一个10

    2> 在某些时候,我们确实没有必要在每一个case后面添加break。下面举一个例子:判断分数的优良中差等级(100分满分)。

     1 int score = 77;
     2   
     3  switch (score/10) {
     4       case 10:
     5       case 9:
     6           printf("优秀");
     7           break;
     8           
     9       case 8:
    10          printf("良好");
    11          break;
    12          
    13      case 7:
    14      case 6:
    15          printf("中等");
    16          break;
    17          
    18      default:
    19          printf("差劲");
    20          break;
    21  }
    • 当score的范围是90~100,score/10的值为10或9时,就会执行第6行代码,然后退出switch语句;
    • 当score的范围是80~89,score/10的值为8时,就会执行第10行代码,然后退出switch语句;
    • 当score的范围是60~79,score/10的值为7或6时,就会执行第15行代码,然后退出switch语句;
    • 当score的范围并不是60~100,score/10的值并不在6~10范围内时,就会执行第19行代码,然后退出switch语句;
    • score的值是77,所以score/10的值是7,输出结果:中等

    4.在case中定义变量

    有时候,我们可能会想在case中定义一些变量,这个时候,就必须用大括号{}括住case中的所有语句。

     1  int a = 10;
     2   int b = 4;
     3   
     4   char op = '-';
     5   
     6   switch (op)
     7   {
     8       case '+':
     9       {
    10          int sum = a + b;
    11          printf("a+b=%d
    ", sum);
    12          break;
    13      }
    14          
    15      case '-':
    16      {
    17          int minus = a - b;
    18          printf("a-b=%d
    ", minus);
    19          break;
    20      }
    21          
    22      default:
    23          printf("不能识别的符号");
    24          break;
    25  }

    在第10、17分别定义两个变量。输出结果:

    a-b=6
  • 相关阅读:
    表格标签
    图片标签
    超链接标签
    媒体标签
    实体标签
    html常用的标签
    头信息的作用
    【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
    【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
    【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆
  • 原文地址:https://www.cnblogs.com/wlios/p/4474089.html
Copyright © 2011-2022 走看看