C语言是面向过程编程语言的主要代表,其特征就是严格控制程序的执行语句顺序,因此,C程序的主要结构控制就是顺序控制,以main函数为入口函数,根据控制,一条一条地执行语句。由于实际需求是很复杂的,只用顺序结构不能表示现实事物的执行流程,图灵提出了三种控制--顺序执行、选择执行和循环执行,只要合理运用这三种流程控制,可以解决世界上的任何流程控制的问题。

  所谓的选择执行就是被选中的代码被执行,没有选中的代码就不被执行。选中与否根据选择的条件来决定,主要使用前面讲解过的条件表达式,如果条件成立,对应的代码块就被执行。

  一、if选择语句:

    1、基本格式为:if(关系表达式或逻辑表达式){

            执行语句1;

            ……

            执行语句n;

          }

    语句块功能:如果括号中的关系表达式或逻辑表达式的结果为真,程序就会执行大括号中的执行语句,可以是多条也可以是一条语句

  例子中如果输入的是8 9,那么执行结果为:

  Please input two numbers splite by space: 8 9
  程序运行结束 

  如果输入的是9 8,那么执行结果为: 

  Please input two numbers splite by space: 9 8
  你输入的第一个数9大于第二个数8!
  程序运行结束
  例子的代码:

  #include <stdio.h>

  int main(int argc, char **argv)
{
int var1 = ;
int var2 = ;
printf("Please input two numbers splite by space: ");
scanf("%d %d", &var1, &var2);
if(var1 >= var2){
printf("你输入的第一个数%d大于第二个数%d!\n", var1, var2);
} printf("程序运行结束\n"); return ;
}

  同一段代码,由于输入数据的次序不同,当输入的8 9时,此时var1为8, var2为9;由于关系表达式var1 >= var2的条件不成立,第10行的代码没有被执行,直接被忽略过了,直接执行了第13行的代码,屏幕输出“程序运行结束”的提示信息,程序就运行结束了。

  当输入的9 8时,此时var1为9, var2为8;由于关系表达式var1 >= var2的条件成立,第10行的代码就被执行,屏幕输出“你输入的第一个数%d大于第二个数%d!”,由于占位符%d的存在,依次使用后面的两个变量var1和var2的值填充到对应的位置,结果就变成了“你输入的第一个数9大于第二个数8!” ,随后执行了第13行的代码,屏幕输出“程序运行结束”提示信息,程序运行结束并退出。

  2、扩展格式为:if(关系表达式或逻辑表达式){

            执行语句1;

            ……

            执行语句n;

          }else{

            执行语句1;

            ……

            执行语句n;

          }

    语句块功能:如果括号中的关系表达式或逻辑表达式的结果为真,程序就会执行紧接者大括号中的执行语句,否则就执行else后大括号中的语句块。特别注意的是:else只能和if搭配使用,不能单独使用。

  例子中如果输入的是8 9,那么执行结果为:

  Please input two numbers splite by space: 8 9
  你输入的第一个数8小于第二个数9!
  程序运行结束  

  如果输入的是9 8,那么执行结果为: 

  Please input two numbers splite by space: 9 8
  你输入的第一个数9大于第二个数8!
  程序运行结束

  例子的代码:

  #include <stdio.h>

  int main(int argc, char **argv)
{
int var1 = ;
int var2 = ;
printf("Please input two numbers splite by space: ");
scanf("%d %d", &var1, &var2);
if(var1 >= var2){
printf("你输入的第一个数%d大于第二个数%d!\n", var1, var2);
}else{
printf("你输入的第一个数%d小于第二个数%d!\n", var1, var2);
} printf("程序运行结束\n"); return ;
}

  同一段代码,由于输入数据的次序不同,当输入的8 9时,此时var1为8, var2为9;由于关系表达式var1 >= var2的条件不成立,第10行的代码没有被执行,执行了else后的代码第12行的代码,屏幕输出“屏幕输出你输入的第一个数%d小于第二个数%d!”,由于占位符%d的存在,依次使用后面的两个变量var1和var2的值填充到对应的位置,结果就变成了“你输入的第一个数9小于第二个数8!”,接着执行第15行,输出“程序运行结束”的提示信息,程序就运行结束了。

  当输入的9 8时,此时var1为9, var2为8;由于关系表达式var1 >= var2的条件成立,执行if后的代码第10行的代码就被执行,屏幕输出“你输入的第一个数%d大于第二个数%d!”,由于占位符%d的存在,依次使用后面的两个变量var1和var2的值填充到对应的位置,结果就变成了“你输入的第一个数9大于第二个数8!” ,随后执行了第15行的代码,屏幕输出“程序运行结束”提示信息,程序运行结束并退出。

  C语言中的唯一的三目运算符条件表达式1?表达式2:表达式3就等效为if(条件表达式1){表达式2}else{表达式3},也就是说当条件表达式1成立时,执行表达式2,否则执行表达式3,常常用三目运算符完成简单的选择问题。

  3、嵌套格式为:if(关系表达式或逻辑表达式){

            执行语句1;

            ……

            执行语句n;

          }else{

            if(关系表达式或逻辑表达式){

                执行语句1;

                ……

                执行语句n;

            }else{

                执行语句1;

                ……

                执行语句n;

            }

          }

    语句块功能:如果括号中的关系表达式或逻辑表达式的结果为真,程序就会执行紧接者大括号中的执行语句,否则就执行else后大括号中的语句块。特别注意的是:else总是和同一代码块中离得最近的if搭配使用,不能单独使用。

  例子的执行结果当分别输入90、82、65和54时,输出对应的提示信息:

  Please input a number range 0 ~ 100: 90
  成绩为90,优秀太好了,努力没有白费!
  程序运行结束

  Please input a number range 0 ~ 100: 82
  成绩为82,怎么只是个良好,要继续努力!
  程序运行结束
  
  Please input a number range 0 ~ 100: 65
  成绩为65,好险总算是及格了!
  程序运行结束

  Please input a number range 0 ~ 100: 54
  成绩为54,天那,竟然没有及格,完蛋了!
  程序运行结束

  例子的代码:  

 #include <stdio.h>

  int main(int argc, char **argv)
{
int var1 = ; printf("Please input a number range 0 ~ 100: ");
scanf("%d", &var1);
if(var1 >= ){
printf("成绩为%d,优秀太好了,努力没有白费!\n", var1);
}else{
if(var1 >= ){
printf("成绩为%d,怎么只是个良好,要继续努力!\n", var1);
}else{
if(var1 > ){
printf("成绩为%d,好险总算是及格了!\n", var1);
}else{
printf("成绩为%d,天那,竟然没有及格,完蛋了!\n", var1);
}
}
} printf("程序运行结束\n"); return ;
}

  代码执行过程,当输入90时,第9行代码中的if中的条件语句成立,执行对应的第10行的代码,输出结果:“成绩为90,优秀太好了,努力没有白费!”第11行到21行的代码都属于else代码块内容,直接忽略跳过,接着执行23行,输出“程序运行结束”,程序退出。

  当输入82时,第9行代码中的if中的条件语句不成立,略过第10行代码,进入else代码块,第12行代码中if的条件语句成立,执行对应的第13行的代码,输出结果:“成绩为82,怎么只是个良好,要继续努力!”第14行到21行的代码都属于else代码块内容,直接忽略跳过,接着执行23行,输出“程序运行结束”,程序退出。

  当输入65时,第9行代码中的if中的条件语句不成立,略过第10行代码,进入else代码块,第12行代码中if的条件语句不成立,略过第13行代码,进入对应的else代码块,第15行代码中的if条件语句成立,执行对应的第16行的代码,输出结果:“成绩为65,好险总算是及格了!”第17行到21行的代码都属于else代码块内容,直接忽略跳过,接着执行23行,输出“程序运行结束”,程序退出。

  当输入54时,第9行代码中的if中的条件语句不成立,略过第10行代码,进入else代码块,第12行代码中if的条件语句不成立,略过第13行代码,进入对应的else代码块,第15行代码中的if条件语句不成立,略过第16行的代码,进入else代码块,执行第18行代码输出结果:“成绩为54,天那,竟然没有及格,完蛋了!”,接着执行23行,输出“程序运行结束”,程序退出。  

  以上代码虽然在逻辑上没有问题,但是针对这种多条件的选择,往往使用switch,代码逻辑会更清晰。

  二、switch选择语句:

    1、基本格式为:switch(变量){

              case 条件语句1:

                执行语句1;

                ……

                执行语句n;

                break;

              case 条件语句2:

                执行语句1;

                ……

                执行语句n;

                break;

        

              …………

 

              case 条件语句n:

                执行语句1;

                ……

                执行语句n;

                break;

              default:

                执行语句;            

          }

    语句块功能:如果括号中的变量与case后的条件语句对应,则对应的case后的执行语句都会被执行;如果都没有对应起来,则执行defalut后的执行语句。特别注意,不要在case语句后添加break语句。

  例子的执行结果当分别输入90、82、65和54时,输出对应的提示信息:  Please input a number range 0 ~ 100: 90
  成绩为90,优秀太好了,努力没有白费!
  程序运行结束

  Please input a number range 0 ~ 100: 82
  成绩为82,怎么只是个良好,要继续努力!
  程序运行结束
  
  Please input a number range 0 ~ 100: 65
  成绩为65,好险总算是及格了!
  程序运行结束

  Please input a number range 0 ~ 100: 54
  成绩为54,天那,竟然没有及格,完蛋了!
  程序运行结束

  代码如下:

  #include <stdio.h>                                                       

  int main(int argc, char **argv)
{
int var1 = ; printf("Please input a number range 0 ~ 100: ");
scanf("%d", &var1);
int temp = var1 / ; switch(temp){
case :
case :
printf("成绩为%d,优秀太好了,努力没有白费!\n", var1);
break;
case :
case :
printf("成绩为%d,怎么只是个良好,要继续努力!\n", var1);
break;
case :
printf("成绩为%d,好险总算是及格了!\n", var1);
break;
case :
case :
case :
case :
case :
case :
printf("成绩为%d,天那,竟然没有及格,完蛋了!\n", var1);
break;
defalut:
printf("成绩非法,请重新输入!");
} printf("程序运行结束\n"); return ;
}

  简单比较,发现使用switch语句替代复杂的if…else嵌套时,代码逻辑更加清晰。当if…else很简单时,也可以使用条件运算符?:来取代,因此这样来看,if…else貌似用处不大,实际上包括linux之父都觉得代码不需要太多的条件判断才行。

《手把手教你学C语言》学习笔记(9)--- 程序的选择控制的更多相关文章

  1. 《手把手教你学C语言》学习笔记(2)---学习C语言的目标和方法

    一.学习C语言的目标主要是: 熟练掌握C语言的关键字,语法规则,程序控制等: 掌握基本的数据结构,数组.链表.栈和队列等: 掌握C语言中指针和内存.数组与指针.函数与指针.变量和指针.结构体和指针.硬 ...

  2. 《手把手教你学C语言》学习笔记(1)---C语言的特点

    学习C语言的原因,主要是需要使用C语言编程,我用故我学,应该是最主要的原因了. C语言的定位:C语言严格意义上只能算是中级语言,是面向过程编程语言的集大成者,虽然这种语言有很多的问题,但总体而言是瑕不 ...

  3. 《手把手教你学C语言》学习笔记(4)---代码规范

    编程过程中需要遵守编译器的各种约定,例如以下代码: 1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 print ...

  4. 《手把手教你学C语言》学习笔记(10)--- 程序的循环控制

    C语言程序设计中,有些代码需要重复执行很多次,循环主要有三类: 一.for循环 1.基本格式为:for(表达式1:表达式2:表达式3){ //表达式1:循环变量赋初值 //表达式2:循环变量满足的条件 ...

  5. 《手把手教你学C语言》学习笔记(8)--- 运算符和表达式

    C语言编程的核心是指针和库,而库的核心就是函数,函数的基本组成部分就是语句. C语言合法表达式加上分号(语句结束符)构成C函数的基本部分语句.如果只有分号没有表达式就构成空语句,空语句常常用来形成占位 ...

  6. 《手把手教你学C语言》学习笔记(7)---程序的输入与输出

    程序设计中,为了观察程序的运行状态和结构,需要输出指定的内容:为了让程序能够更加灵活,可以根据需求输入内容,让计算机处理和运行:所以程序的输入输出就显的尤为重要.主要包括printf和scanf函数. ...

  7. 《手把手教你学C语言》学习笔记(6)---数据类型和常量

    计算机中需要保存信息,就需要数据存储,数据的存储就需要划分数据类型.主要包括:基本数据类型.指针类型.构造类型.空类型. 基本类型:整型---主要用来表示整数,可以分为无符号和有符号:又分为基本整型. ...

  8. 《手把手教你学C语言》学习笔记(5)---计算机的存储和访问

    数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是 ...

  9. 《手把手教你学C语言》学习笔记(3)---变量

    编程目的是为了解决问题,编程本质是用计算机的思维操作数据,操作就是算法,数据主要是数据类型,也可以说量,其中分为常量和变量,常量主要是指在量的生命周期内无法改变其值:变量主要是指在量的生命周期内可以随 ...

随机推荐

  1. day03_基本数据类型基本运算

    1.什么是数据类型 变量值才是我们存储的数据,所以数据类指的就是变量值的不同种类 2.为何数据要分类型? 变量值是用来保存现实世界中的状态的,那么针对不同的状态就应该用不同类型的数据去表示 3.如何用 ...

  2. 数据存储之json文件处理和csv文件处理

    什么是json: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用 ...

  3. MTCNN学习资源

    MTCNN pytorch版本的实现 TropComplique/mtcnn-pytorch https://github.com/TropComplique/mtcnn-pytorch MTCNN实 ...

  4. A1055 The World's Richest(25 分)

    A1055 The World's Richest(25 分) Forbes magazine publishes every year its list of billionaires based ...

  5. A1046 Shortest Distance (20)(20 分)

    1046 Shortest Distance (20)(20 分)提问 The task is really simple: given N exits on a highway which form ...

  6. 2018 Multi-University Training Contest 1 H - RMQ Similar Sequence(HDU - 6305 笛卡尔树)

    题意: 对于一个序列a,构造一个序列b,使得两个序列,对于任意的区间 [l, r] 的区间最靠近左端点的那个最大值的位置,并且序列 b 满足 0 < bi < 1. 给定一个序列 a ,求 ...

  7. 图论:HDU2544-最短路(最全、最经典的最短路入门及小结)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. 1022: [SHOI2008]小约翰的游戏John9(Auti_SG)

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3150  Solved: 2013[Submit] ...

  9. day09 threading, paramiko, queue 模块

    1 模拟ssh 2 锁 内部锁,程序锁,信号量 3 多线程 4  简单消息队列 先来看模拟ssh  ,python 的强大之处就是因为有很多模块,可以很简单的完成复杂的事情,今天我们用paramiko ...

  10. 数据库路由中间件MyCat - 使用篇(1)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单 ...