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
  • 相关阅读:
    POJ 3258 (NOIP2015 D2T1跳石头)
    POJ 3122 二分
    POJ 3104 二分
    POJ 1995 快速幂
    409. Longest Palindrome
    389. Find the Difference
    381. Insert Delete GetRandom O(1)
    380. Insert Delete GetRandom O(1)
    355. Design Twitter
    347. Top K Frequent Elements (sort map)
  • 原文地址:https://www.cnblogs.com/wlios/p/4474089.html
Copyright © 2011-2022 走看看