条件的表示
如何表示各种条件?判断条件是否成立的依据是什么?例如,在购票是如何判断淡季或旺季?对于更复杂的条件如何表示?在C语言中主要使用关系运算和逻辑运算来表示各种条件。
1. 关系运算
在程序中经常需要比较两个数据的大小,以决定程序下一步的执行过程。关系运算的功能就是比较两个运算对象的大小关系。如果描述的大小关系成立,结果为“真”,用“1”表示;不成立则结果为“假”,用“0”表示。在C语言中,将非0视为“真”,0视为“假”。 C语言提供了6种关系运算符,如下表;
运算符 | 含义 | 操作数要求 | 优先级 | 结合方向 | 运算实例 | 运算结果 |
< | 小于 | 2个(二元) | 6 | 从左向右 | a+b<c+d | 1((a+b)<(c+d)) |
<= | 小于等于 | a<+2*b | 1((a<=(2*b)) | |||
> | 大于 | 'a'>'b' | 0(ASCII值比较) | |||
>= | 大于等于 | d>=c>=b | 0((d>=c)>=b) | |||
== | 等于 | 7 | a>b==c>d | 1((a>b)==(c>d)) | ||
!= | 不等于 | b==2!=c | 1((b==2)!=c) |
注 在连续使用关系运算符时,要注意正确表达运算的含义,以及运算优先级和结合方向。例如,上表中d>=c>=b在数学上是成立的,运算的结果为1,而在C语言中运算的过程是,先求出d>=c的结果,在将结果1做>=b判断,最终表达式的结果为0。如果要表达式d>=c>=b在数学上成立,就要运用下面介绍的逻辑运算符进行连接,即写为d>=c&&c>=b。
2. 逻辑运算
在程序设计中,有时要求一些条件同时成立,有时只要求其中一个条件成立,这时就要用到逻辑运算符。C语言提供了3种逻辑运算符,如下表:
运算符 | 含义 | 操作数要求 | 优先级 | 结合方向 | 运算实例 | 运算结果 |
! | 逻辑非 | 1个(一元) | 2 | 从右向左 | !3 | 0 |
&& | 逻辑与 | 2个(两元) | 11 | 从左向右 | 3&&4 3&&0 0&&0 | 1 0 0 |
|| | 逻辑或 | 12 | 3||4 3||0 0||0 | 1 1 0 |
a | b | !a | a&&b | a||b |
非0 | 非0 | 0 | 1 | 1 |
非0 | 0 | 0 | 0 | 1 |
0 | 非0 | 1 | 0 | 1 |
0 | 0 | 1 | 0 | 0 |
(1)逻辑非(!):单目运算符,对运算对象的值取反,运算对象为真时,结果为假;运算对象为假时,结果为真。 (2)逻辑与(&&):双目运算符,两个运算对象同时为真时,运算结果才为真,否则为假。 (3)逻辑或(Il):双目运算符,两个运算对象任意一个为真时,运算结果即为真,同时为假时,结果为假。
如何判断一个字符是否为英文字母?我们知道英文字母包括大写字母和小写字母共52个。对应的逻辑表达式为:ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'其中ch表示要判断的字母。用表达式ch>='A'&&ch<=Z'判断字符变量ch的值是否为大写字母,用ch>='a'&&ch<='z'判断字符变量ch的值是否为小写字母,那么表达式ch>='A'&&ch<=Z'||ch>='a'&&ch<='z判断字符变量ch的值是否为大写或者小写字母,即是否为任意字母。 从逻辑运算真值表可以看出,逻辑与、逻辑或有如下特点: (1)a&&b,当a为0时,无论b为何值,结果均为0。 (2)allb,当a为1时,无论b为何值,结果均为1。 C语言利用上述性质,在进行逻辑与运算时,如果左侧运算对象为0,则不需计算右侧的运算对象,直接判断逻辑运算的结果为0;而进行逻辑或运算时,如果左侧运算对象为1,则不需计算右侧的运算对象,直接判断逻辑运算的结果为1。 也就是说,逻辑与、逻辑或这两个运算符有很特别的“短路”功能,即无论进行单个还是连续的逻辑运算,都严格按照从左到右的方向进行。当根据左侧的运算对象已经能判断整个逻辑表达式的结果时,则不再计算右侧的运算对象。
单分支结构
在C语言程序设计中,表达选择某种条件的典型控制结果是if语句和switch语句。本节先讨论if的单分支结构。
if单分支结构的语句格式如下: if(表达式) { 语句 }
注意,表达式两边的圆括号是必需的,他们是if语句的组成部分。
if单分支结构的执行流程如下: (1)计算圆括号内表达式的值。 (2)如果表达式的值为非0(C语言把非0值解释为“真”值),则执行圆括号后边的语句(复合语句),然后退出选择控制结构。 (3)如果表达式的值为0(C语言把0值解释为“假”值),则直接退出选择结构。
双分支结构
根据判断条件是否成立有两种选择,而且要在这两种选择中选择其一执行,就是双分支结构。
if双分支结构的语句格式如下: if(表达式) {语句1} else {语句2}
if...else双分支结构执行流程如下: (1)计算表达式的值。 (2)如果表达式值为非0,则执行语句(复合语句)1,然后退出选择控制结构。 (3)如果表达式的值为0,则执行语句(复合语句)2,然后退出选择控制语句。
条件运算
条件运算符是C语言中唯一的一个三目运算符,由两个符号“?”和“:”组成,需要3个运算对象,其使用格式如下: 表达式1?表达式2:表达式3 求解过程中:若表达式1的值为真(非0),则执行表达式2,将其结果作为整个表达式的值,否则执行表达式3,将其结果作为整个条件表达式的值。
运算符 | 含义 | 操作数要求 | 优先级 | 结合方向 | 运算实例 | 运算结果 |
:? | 条件运算符 | 3个(三元) | 13 | 从右往左 | a>b?a:c>d?c:d | a>b?a:(c>d?c:d) |
if...else 嵌套
if语句的嵌套是指在if或else子句中又包含一个或多个if语句。内层的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。内嵌if语句的一般格式如下: if (表达式1) if (表达式2) 语句1 else 语句2 else if (表达式3) 语句3 else 语句4
这种基本形式嵌套的if语句也可以进行以下几种变化。 (1)只在if子句中嵌套if语句,格式如下: if (表达式1) if (表达式2) 语句1 else 语句2 else 语句3
(2)只在else子句中嵌套if语句,格式如下: if (表达式1) 语句1 else if (表达式2) 语句2 else 语句3
(3) 不断在else子句中嵌套if语句,形成多层嵌套,格式如下: if (表达式1) 语句1 else if (表达式2) 语句2 else ...... if(表达式n) 语句n else 语句n+1
此种情况形成了多分支的if语句,此时的语句可以用以上语句格式表示,语句的层次比较分明。
if...else 配对
嵌套的if语句可能有又是if...else语句,这将会出现多个if和else重叠的情况,这时要特别注意if与else的配对关系规则。if与else配对的规则如下所述。 (1)缺省“{ }”时,else总是与它上面的最近的未配对if配对。例如: if () if () 语句1 else if () 语句2 else 语句3 编程者把else写在第一个if(外层if)的同一列上,希望else与第一个if对应,但实际上else是与第二个if配对的,因为他们相距最近。
(2)if与else数目不一样时,为实现编程者的意图,可以加({ })来确定配对关系。 if ( ) {if() 语句1} else if () 语句2 else 语句3 这时“{ }”限定了内嵌if语句的范围。
多分支结构
if语句的级联
if多分支结构语句的格式如下: if (表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 ...... else if(表达式n) 语句n else 语句n+1 其执行过程中:首先判断表达式1的条件是否成立,若成立则执行语句1,否则判断表达式2的条件是否成立,若成立则执行语句2,……,以此类推,若n个表达式的条件都不成立,则执行语句n+1,然后退出选择语句。
switch语句
if语句一般用于两个分支的选择执行,尽管可以通过if语句的嵌套形式实现多选择,但这样往往会使if语句的嵌套层次太多,降低了程序的可读性。而C语言中的switch语句也是一种多分支选择结构,它提供了更方便的选择功能。 switch多分支选择语句的一般格式如下: switch(表达式) { case 常量表达式1:语句1 case 常量表达式2:语句2 …… case 常量表达式n:语句n default: 语句 n+1 } 执行过程:首先计算switch表达式的值,然后与各个case的“常量表达式”进行比较,若相等,则从其下的语句开始,依次向下执行各语句块的语句,直至遇到强制中断语句break或执行完最后一个语句块为止;若所有case都不符合要求,则执行default下面的语句块。 注 (1)switch语句后面的表达式必须用圆括号括起来,其取值必须是整型、字符型或枚举类型。switch语句后面用花括号括起来的部分称为switch语句体,其中的“!”不能省略。 (2)case后面必须是常量或常量表达式,不能是变量。case与其后面的常量表达式合称为case语句标号,由它来判断该执行哪条case后面的语句。case和其后面的常量表达式中间应该有空格。常量表达式的类型必须与switch后面的表达式的类型相同。 (3)各case语句标号值应该互不相同。case语句标号后的语句1、语句2等可以是一条语句,也可以是若干条语句。 (4)default也起标号的作用,代表所有case标号之外的标号,即default可以出现在语句体中任何标号的位置上,而不会影响程序的执行结果。在switch语句体中可以没有default标号。