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. DevOps - 监控告警 - Zabbix

    官网3.4版本中文文档 Zabbix documentation in Chinese [Zabbix Documentation 3.4] https://www.zabbix.com/docume ...

  2. JS — 实现简单的数字时钟

    js实现简单的数字时钟 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  3. ecshop里提出来的js常用函数

    目录 Utils.js jquery.listTable.js 使用例子: ecshop里提出来的js常用函数 Utils.js /* $Id : utils.js 5052 2007-02-03 1 ...

  4. 如何使用pyinstaller打包32位的exe

    说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位.而64位的exe文件在32位的win7操作系统下是无法执行的,显示不兼容.网上查询发现,简单(可能不方便 ...

  5. Python9-前端基础知识-day47

    web开发本质: 1.浏览器输入网址回车都发生了什么? 1.浏览器给服务端发送一个消息 2.服务端拿到消息 3.服务端返回消息 4.浏览器展示页面C/S架构----B/S架构客户端和服务端 消息的格式 ...

  6. Kilani and the Game CodeForces - 1105D (bfs)

    Kilani is playing a game with his friends. This game can be represented as a grid of size n×mn×m, wh ...

  7. D3DXCreateTexture

    HRESULT D3DXCreateTexture( __in LPDIRECT3DDEVICE9 pDevice, __in UINT Width, __in UINT Height, __in U ...

  8. day19 Dgango进阶 路由系统及 ORM 详解

    完成一个完整的网页服务,需要有以下: 再次回顾一下Django 的完成开发流程: 一些值的获取: 对于性别,为互斥属性: 爱好则为多选: 需要使用新的方法 getlist 来获取多个爱好: 单选下拉框 ...

  9. leetcode 【 Linked List Cycle II 】 python 实现

    公司和学校事情比较多,隔了好几天没刷题,今天继续刷起来. 题目: Given a linked list, return the node where the cycle begins. If the ...

  10. jmeter将上一个请求的结果作为下一个请求的参数——使用正则提取器

    转自:http://www.cnblogs.com/0201zcr/p/5089620.html 在压力测试的时候,经常要将几个流程串联起来才能将程序测试通过.如:我现在用户首先要登录,获得我登录的凭 ...