第4章 简单的C程序设计——选择结构程序设计

在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必作任何判断。实际上,很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。

4.1选择结构和条件判断

例:定义一个函数,如果饿了吃饭。如果不饿不吃饭。

 1 #include <stdio.h>
 2 int main()
 3 {
 4      a;
 5     printf("请输入一个数 0或1 ,0代表不饿,1代表饿了\n");
 6     scanf(%d",%a);
 7     if(a!=0||a!=1)
 8         printf(输入错误\n 9     if(a==10         printf(饿了,吃饭。。。\n11     else
12         printf(不饿,不吃饭。。。\n13     return 0;
14 }
View Code

1 若输入0则,输出“不饿,不吃饭。。。”
2 若输入1则,输出“饿了,吃饭。。。”
3 若输出其他值,输出”输入错误“
code result

 

C语言有两种选择语句:(1)if语句,用来实现两个分支的选择结构;(2)switch语句,用来实现多分支的选择结构。

4.2 用if语句实现选择结构

4.2.1 用if语句处理选择结构举例

例:实现两个变量的交换

 a,b,temp;
请输入两个数a b\n%d%d,a,b);
 7     printf(你输入的值a=%d,b=%d\n 8     printf(正在交换两个数的位置\n 9     temp =10     a = b;
11     b = temp;
12     printf(交换后的值a=%d,1)">14 }
View Code

1 若输入1,2;则输出:
3     请输入两个数a b
4     你输入的值a=1,b=2
5     正在交换两个数的位置
6     交换后的值a=2,1)">1
7 }
Code Result

 

4.2.2 if语句的一般形式

if语句的一般形式如下:

if(表达式) 语句1

         [else 语句2]

if语句中的“表达式”可以使关系表达式、逻辑表达式,甚至是数值表达式。

关系表达式就是两个数值进行比较的式子。

根据if语句的一般形式,if语句可以写成不同的形式,最常用的优以下3中形式:

(1)if(表达式)

语句1[复合语句]           (没有else子句部分)

(2)if(表达式)                             (有else子句部分)

         语句1[复合语句] 

else

         语句2[复合语句] 

(3)if(表达式1)         语句1[复合语句]  (在else部分又嵌套了多层的if语句)

  else if(表达式2) 语句2[复合语句]        

  else if(表达式3) 语句3[复合语句]        

         …                      …

else if(表达式m) 语句m[复合语句] 

else                            语句m+1[复合语句]    

 

注意:复合语句应当用花括号括起来。{} 花括号括起来的多条语句称为复合语句。

 

4.3 关系运算符和关系表达式

在C语言中,比较符(或称比较运算符)称为关系运算符。所谓“关系运算”就是“比较运算”,将两个数值进行比较,判断其比较的结果是否符合给定的条件。

 

4.3.1 关系运算符机器优先次序

C语言提供6中关系运算符:

①<  (小于)

②<=         (小于或等于)

③>  (大于)

④>=         (大于或等于)

⑤==         (等于)

⑥!= (不等于)

①②③④优先级相同(高),⑤⑥优先级相同(低)

关于优先次序:

(1)前四种关系运算符(< <= > >=)的优先级相同,后2种也相同。前4种高于后2种。

(2)关系运算符的优先级低于算术运算符

(3)关系运算符的优先级高于赋值运算符

 

4.3.2 关系表达式

用关系运算符将两个数值或数值表达式连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。

在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。更准确来说,是“!0”代表真,“0”代表假。

4.4 逻辑运算符和逻辑表达式

4.4.1 逻辑运算符及其优先次序

有3中逻辑运算符:与(AND) 或(OR) 非(NOT)。注意:在C语言中不能在程序中直接用AND、OR、NOT作为逻辑运算符,而是用其他符号代替。C逻辑运算符及其含义如下:

“&&”和“||”是双目(元)运算符,它要求有两个运算对象(操作数);“!”是一目(元)运算符,只要求有一个运算对象。逻辑运算真值表:

按以下的优先次序:

(1)!(非)->&&(与)->||(或),即“!”为三者中最高的

(2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。

 

4.4.2 逻辑表达式

逻辑表达式的值应该是一个逻辑量“真”或“假”。

实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是字符型、浮点型、枚举型或指针型的纯量型数据。(关于纯量型的讲解,在本人博客里C Language的第2章里有讲解)系统最终以0和非0来判定他们属于“真”或“假”。逻辑运算的真值表(用0和非0表示的另一种格式):

在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符;如

(1)a&&b&&c。只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为假,就不必判断b和c的值(此时整个表达式已确定为假)。换个说法,就是a若为假,则b和c被短路了,不会被执行。

(2)a||b||c。只要a为真(非0)是,就不必判断b和c。只有a为假,才判别b。a和b都为假才判别c。

 

4.4.3 逻辑型变量

这是C99有所增加的一种数据类型。可将关系运算和逻辑运算的结果存到一个逻辑变量中,以便于分析和运算。定义逻辑变量用类型符_Bool.

float score;

scanf(“%f”,&score);

_Bool a,b;                                 //a和b被定义为逻辑型变量

a = score>=60;                                   //将关系表达式score>=60的值赋给逻辑变量a

b = score<=69;                                   //将关系表达式score<=60的值赋给逻辑变量b

if(a&&b)                                     //如果a和b均为真,输出分数等级为C

         printf(“The grade is C\n”);

 

   如果在源文件中用#include指令包含了头文件stdbool.h,那么上面的程序段可以写成:

float score;

scanf(“%f”,&score);

bool a,b;                           //a和b被定义为逻辑型变量

a = score>=60;                                   //将关系表达式score>=60的值赋给逻辑变量a

b = score<=69;                                   //将关系表达式score<=60的值赋给逻辑变量b

if(a&&b)                                     //如果a和b均为真,输出分数等级为C

         printf(“The grade is C\n”);

 

注意:在使用bool类型时,要先了解自己所用的编译系统能否允许使用逻辑型变量bool和true和false.

4.5 条件运算符和条件表达式

有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值,如:

if(a>b)

         max = a;

else

         max = b;

以上的if语句可以改写为:

         max = (a>b)?a:b;

条件运算符有两个符号(?和:)组成,必须一起使用,要求有3个操作对象,称为三目(元)云三幅,它是C语言中唯一的一个三目运算符。

条件表达式的一般形式为:

表达式1?表达式2:表达式3

执行过程:先计算出表达式1的值,若为非零(真),则执行表达式2;否则,执行表达式3.

说明:

(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假)则求解表达式3,表达式3的值就作为整个条件表达式的值。

(2)条件运算符优先于赋值运算符,因此复制表达式的求解过程是先求解条件表达式再将它的值赋给max

条件运算符的优先级别比关系运算符和算术运算符都低。

例:输入一个字符,判别它是否为大写字母,若是,则转换为小写字母。

#include <stdio.h>

int main()

{

         char ch;

         scanf(“%c”,&ch);

         ch = (ch>=’A’&&ch<=’Z’)?(ch+32):ch;

         printf(“%c\n”,ch);

         return 0;

}

运行结果 A 回车 a

4.7选择结构的嵌套

在if语句中又包含一个或多个if语句称为if语句的嵌套(nest)。其一般形式如下:

if()

         if()   语句1

         else()       语句2

else

         if()            语句3

         else()       语句4

应当注意,if与else的配对关系。else总是与它上面的最近的未配对的if配对。如:

if()

         if()    语句1

else

         if()    语句2

else          语句3

有些编程者会把else写在与第1个if(外层if)同一列上,意图是使else与第1个if对应,但实际上else是与第2个if配对,因为它们相距最近。

为了避免二义性的混淆,最好使内嵌if语句也包含else部分。如:

if()

{

         if() 语句1

}

else 语句2

这时“{}”限定了内嵌if语句的范围,因此else与第一个if配对。

 

4.7用switch语句实现多分支选择结构

C语言提供switch语句直接处理多分支选择。

switch语句是多分支选择语句。

switch渔具店作用是根据表达式的值,是流程跳转到不同的语句。switch语句的一般形式如下:

switch(表达式)

{

         case 常量1 : 语句1

case 常量1 : 语句1

         …                     

         case 常量n : 语句n

         default :      语句n+1

 

}

 

说明:

(1)switch后面的括号内的“表达式”,其值的类型应为整数类型(包括字符型)

(2)switch下面的花括号内是一个复合语句。这个复合语句包括若干语句,它是switch语句的语句体。语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行。

case后面跟一个常量(或常量表达式),如:case ‘A’ ,它们和default都是标号(label或称标签、标记的作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。换句话说,就是表达式和case后面的常量比较,有适配的就执行对应的语句;如果case没有匹配的常量,就执行default后面的语句。

(3)可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。

(4)各个case标号出现次序不影响执行结果。如,可以先出现default标号,然后再出现case标号。

(5)每一个case常量必须互不相同;否则就会出现相互矛盾的现象(对switch表达式的同一个值,有两种或多种执行方案)

(6)case标号只起标记的作用。如果在个case子句中没有break语句,则会连续输出剩下从case标号对应的语句,直至遇到break或者结束switch选择分支。

注意:一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行。最后一个case子句(或者default子句)中可不必加break语句,因为流程已到了switch结构的结束处。

(7)在case子句中虽然包括了一个以上执行执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然也可以加上花括号。

(8)多个case标号可以共用一组执行语句。

例:case ‘A’

         case ‘B’

         case ‘C’ : printf(“>60\n”);break;

当值为’A’ ’B’ ’C’时,都会执行同一组语句,输出“>60”,然后换行。

 

例:

 2 
 4 
 5  6 
char ch;
 8 
 9     ch = getchar();
10 
switch(ch)
12 
13     {
14 
15          case 'a':
16 
17          b18 
19          c: {
20 
21                       printf(22 
23                       printf(24 
25                       printf(26 
27                     }
28 
29     }  
30     31 
32 }
View Code

 

运行结果:输入a 输出结果为abc;

   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代码的工具, 肯定没有IDE来的直观了. 不过, 命令行自然有命令行的有点, 当你无法是使用IDE时, gdb有时会帮上很大的忙. 下面用1个例子来说明用法吧: 建立1个目录testgdb2 1. 编写c文件test.c可以见到在2
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int a[5]={1,2,3,4,5}; //合法int b[6]; //合法int c[]; //错误 因为没有指定长度但是下面语句是正确, 它隐形定义了数组的长度, 就是赋值元素的个数int d[] ={4,5,6,7,8,9} /
C++的auto关键字在C+⬑新标准出来之前基本上处于弃用的状态,到C+⬑新标准发布之后,auto关键字被赋予了新的意义,并且功能也变得很强大,此篇文章重点介绍auto关键字的新功能、新用法,以及在C+⬔、C+⬗、C+⬠各版本中对它的使用缺陷和限制不断地修正和增强,当然auto关
const关键字是用于定义一个不该被改变的对象,它的作用是告诉编译器和其他程序员不允许修改这个对象的值或者状态。当程序员看到使用const修饰的代码时就知道不应该修改对应对象的值,而编译器则会强制实施这个约束,任何违反这个规定的代码会在编译期间报错。它可以用于任何函数或者类之后的全局或namespa
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C++编一下链表,搞了大半天才搞出来,所以就赶紧整理一下记录下来,省的万一时间长了找不到代码哈哈。一、链表代码1、Node.h文件代码#pragma onceclass Node{public: int ID; char alph; Node* next; Node(int ID,char alph); ~Node();private:..._if(current->id==id)
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章目录一、VS中的命令行参数二、内联函数和宏三、初始化和赋值一、VS中的命令行参数今天在运行代码的时候,碰都了下面的情况: // 解析命令行参数 if (pcl::console::find_argument (argc, argv, "-h") >= 0) { printUsage (argv[0]); return 0; }..._"if (pcl::console::find_argument(argc, argv, "-f") >= 0)怎么输入参数"
文章浏览阅读1.8k次,点赞11次,收藏37次。因为自己对决策树的机制非常的好奇,所以就研究了一下决策树的ID3算法,在这也做一篇笔记记录一下过程。文章目录一、什么是决策树?二、信息增益2.1信息熵2.1.1定义2.1.2演变2.2信息增益三、ID3算法实现四、小结一、什么是决策树?这个问题是我从一开始就有的疑问,什么是决策树?在看了一些资料之后,因为没有看到书上给出具体定义,所以按照我自己的理解决策树就是通过一个个“决策”而构建的一种树状结构,而且决策树的整个处理机制非常类似于我们人类在面临决策问题时的处理机制,这也可能就是其名字的由来。决_c++id3
文章浏览阅读492次。C++ 设计模式之策略模式
文章浏览阅读683次。我也算是个C++的小白,对于C++中的谓语我第一时间就想到了C#中的委托,但两者又不尽相同,所以想写一篇笔记记录一下。文章目录一、什么是谓语?二、使用谓语一、什么是谓语?谓语是一个可调用的表达式,其返回的结果可以作为条件的值,在C++中其实就是向算法传递函数。这和C#中的委托的概念其实是一样的,都是将函数作为参数进行传递。C++标准库中的谓语主要有两类:一元谓语和二元谓语,也就是有的算法只能..._谓语句 c++
文章浏览阅读225次。又看了一遍操作符的东西,感觉之前对操作符的理解还停留在很浅的认知上(仅仅会用哈哈),所以做一下笔记来加深一下印象。文章目录一、为什么会有操作符重载?二、操作符重载作用的对象一、为什么会有操作符重载?如果要回答这个问题,我们其实应该仔细想一下如果没有操作符重载会怎样呢?这其实很容易就联想到了C语言,因为他就没有操作符重载这一说。虽然C语言中没有类class这一概念,但是他有着和类及其相似的结构..._6-6 我的朋友 - c/c++ 操作符重载分数 15作者 海洋饼干叔叔单位 重庆大学实现frie
文章浏览阅读216次。因为之前碰到了很多关于C++上的问题,现在整理并记录一下。文章目录一、引用一、引用在C++中,引用就是给对象起了另一个名字,也就是“对象别名”。感觉和什么东西很相似,仔细一想不就是类型别名“typedef”吗哈哈。它其实是和原对象形成了一种绑定的一种关系,..._vc++6.0报错:returning address of local
文章浏览阅读565次。因为一直好奇预处理器的工作机制,所以就查了查书,做一下自己看完书之后的笔记。文章目录一、预处理器的作用一、预处理器的作用_c语言预处理器作用
文章浏览阅读1.8k次,点赞3次,收藏10次。最近特别查阅了一下关于C++文件的输入/输出的资料,整理了一下就写一下笔记。文章目录一、什么是流二、什么是缓冲区三、代码实现文件IO3.1 使用文件流对象读取数据3.2重定向一、什么是流当前的计算机具有很多种设备,但是无论是哪种设备都要与数据和信息进行打交道,所以这就牵扯到设备与数据之间的I/O操作。而每种设备又有着不同的特性和操作协议,由于过于复杂,所以我们一般是不会和这些通信细节打交道的..._c++ inpath
文章浏览阅读4.8k次,点赞6次,收藏29次。因为要使用到C++的动态链接库,所以就特意网上找了一下资料实现了一下。文章目录一、lib与dll文件二、创建dll文件三、dll隐式链接四、显式链接五、小结一、lib与dll文件之前我一直以为动态链接库就是指dll文件,这也是C#给我造成的一种印象,因为在C#中建立的类库文件都是dll文件,而且只要简单引用就可以了,但是C++却并不是这样的,这可能是因为C#隐藏了一些细节的缘故吧。在C++中共有两种库模式,一种是包含lib和dll两种文件,这种情况下其中的lib文件包含了函数所在的dll文件和dl_c++调用动态链接库
文章浏览阅读973次。因为遇到了一这个操作符的问题,所以记录一下出现的问题*~*。一、问题描述二、产生原因因为也是第一次出现这个问题,所以就到网上查了一些资料和书籍,现在倒也大概理解这个错误出现的原因了。有时候举个例子可能更容易理解为啥会出现这个错误,就拿一本书中的例子来说一下,如下所示:template<class T> class NamedObject { public: NamedObject(std::string& nameVal, const T objectVal) __copy_assign报错
C语言中的单向链表可以解决数组和结构体在使用时的内存连续性问题,同时还能动态地调整长度。本文介绍了单向链表的结构和基本操作,并给出了一个简单的示例代码。
文章浏览阅读2.3k次。区分'0'、"0"、0、''_0和
文章浏览阅读5.8k次,点赞4次,收藏8次。C语言函数指针详解,微剖本质_c语言指针函数
数组指针和指针数组是代码中常见的定义形式。虽然它们的语法类似,但含义完全不同。对于一维数组而言,数组名即为首元素的地址,不需要取址即可赋值给指针。而对于二维数组,数组名代表首行元素的地址,可以看作是一个指针数组,需要使用取址操作。
文章浏览阅读297次。总结刚入门的新同学C语言编程常见的低级错误