C语言学习-选择结构if语句、switch语句

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

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

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

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

3种流程图如下:

一、顺序结构

1 int main(){
2 
3      printf("hello world!\n");
4      
5      printf("I like iOS!\n"); 
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成立\n");
 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\n");
 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\n");
 8               break;
 9          case 2:
10              printf("summer\n");
11              break;
12          case 3:
13              printf("autumn\n");
14              break;
15          case 4:
16              printf("winter\n");
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\n");
 6       case 5:
 7           printf("这是一个5\n");
 8       case 10:
 9           printf("这是一个10\n");
10          break;
11      default:
12          printf("什么也不是\n");
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\n", sum);
12          break;
13      }
14          
15      case '-':
16      {
17          int minus = a - b;
18          printf("a-b=%d\n", minus);
19          break;
20      }
21          
22      default:
23          printf("不能识别的符号");
24          break;
25  }

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

a-b=6

转载于:https://www.cnblogs.com/wlios/p/4474089.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值