选择结构和判断
C语言由两种选择语句:
if语句,用来实现两个分支的选择结构。
switch语句,用来实现多分支的选择结构。
再用scanf函数输入双精度实型数据时,不能用“%f”格式声明,而应当用“%lf”格式声明;
在格式符f的前面加修饰符l(小写字母),表示是“长浮点型”,即双精度型;在输出双精度实型数据时,可以用"%f","%lf"或"%m.nf"以指定输出的精度。
用if语句实现选择结构
用if语句处理选择结构举例
为了实现两个变量的值互换,必须借助于第三个变量,这是在程序中两个变量换值的算法。
if语句的一般形式
if (表达式) 语句1
[ else 语句2 ]
“表达式”可以是关系表达式、逻辑表达式、数值表达式;其中最直观、最容易理解的是关系表达式;
所谓关系表达式就是: 两个数值进行比较的式子。
方括号内的部分(即else子句)为可选的,既可以有也可以没有。
语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个if语句(嵌套一个或多个if语句)。
if (表达式) 语句1
if (表达式)
语句1
else
语句2
if (表达式1) 语句1
else if(表达式2) 语句2
else if(表达式3) 语句3
. .
. .
else if(表达式m) 语句m
else 语句m+1
整个if语句可以写在多行上,也可以写在一行上:
if (x>0) y=1;else y=-1;
if语句无论写在几行上,都是一个整体,属于同一个语句;在系统对if语句编译时,若发现内嵌语句结束(出现分号),还要检查其后有无else,如果无else就认为整个if语句结束,否则把else作为if语句的一部分;else语句不能单独使用,它必须是if语句的一部分,与if配对使用。
"语句1、2、3.....m"可以是一个简单的语句,也可以是一个包括多个语句的复合语句,复合语句应当用{ }括起来。
内嵌语句也可以是if语句
在if语句中要对给定的条件进行检查,判断所给的条件是否成立,判断的结果是一个逻辑“是”或“否",在计算机语言中用”真“和”假“来表示”是“或”否“。
每个内嵌语句的末尾都应当有分号,因为分号是语句中的必要成分。
关系运算符和关系表达式
比较符(或比较运算符)称为关系运算符,所谓”关系运算“就是比较运算,将两个数值进行比较,判断其比较的结果是否符合给定的条件;如果比较的结果满足条件则值为真,否则值为假。
关系运算符及其优先次序
C语言提供6种关系运算符:
< (小于)
<= (小于或等于)
> (大于)
>= (大于或等于)
== (等于)
!= (不等于)
优先级:
算术运算符>关系运算符>赋值运算符
关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。
关系表达式的值是一个逻辑值,即“真”或“假”;
在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”;关系表达式“a>b”的值为“真”,表达式的值为“1”。
逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式。
逻辑运算符及其优先次序
有3种逻辑运算符:与(AND)、或(OR)、非(NOT);
在BASIC和Pascal等语言中可以直接在程序中用AND、OR、NOT作为逻辑运算符,在C语言中不能在程序中直接用AND、OR、NOT作为逻辑运算符,而是用其他符号代替。
运算符 | 含义 | 举例 | 说明 |
&& | 逻辑与(AND) | a && b | 如果a和b都为真则结果为真,否则为假。 |
|| | 逻辑或(OR) | a || b | 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假。 |
! | 逻辑非(NOT) | !a | 如果a为假,则!a为真,如果a为真,则!a为假。 |
“&&”和“||”是双目(元)运算符,要求有两个运算对象(操作数)(a>b)&&(x>y)、(a>b)||(x>y);“!”是单目运算符,只要求有一个运算对象!(a>b)。
优先次序:
!(非)> && (与) > || (或) ;“!”为三者中最高的。
逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。
逻辑表达式
逻辑表达式的值应该是一个逻辑量“真”或“假”;用数值1代表真,用0代表假;即一个非零的数值认作为“真”。
逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真’对待),在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。
表达式自左向右求解
实际上,逻辑运算符两侧的运算对象不但可以是0或1,或者是0或非0的整数,也可以是字符型、浮点型、枚举型或指针型的纯量型数据;系统最终以0或非0来判定它属于”真“或”假“。
例如:'a' && 'd' 的值为1(因为'c'的'd'的ASCII值都不为0,按”真“处理),所以1&&1的值为1.
并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
在if语句中表达式可以是任何数值表达式:
if (x!=0) 语句1 | //括号内的表达式是关系表达式,如果x不等于0,执行语句1 |
if (x>0 && y>0) 语句2 | //表达式是逻辑表达式,如果x和y都大于0,执行语句2 |
if (x) 语句3 | //表达式是变量x,如果x不等于0,则条件判断为真,执行语句3 |
if (1) 语句4 | //表达式是非0整数,条件判断结果为真,执行语句4 |
if (0) 语句5 | //表达式是整数0,条件判断结果为假,不执行语句5,接着执行下一语句 |
if (x+3.5) 语句6 | //表达式是实数表达式,若x+3.5不等于0,则条件判断结果为真,执行语句6 |
条件运算符和条件表达式
有一种if语句,当被判别的表达式的值为”真“或”假“时,都执行一个赋值语句且向同一个变量赋值:
改写为:
赋值号右侧的”(a>b)?a:b“是一个“条件表达式”,”?“是条件运算符。如果条件“(a>b)”成立为真,则条件表达式的值等于a,否则取值b。
运算符由两个符号(? 和 :)组成,且必须一起使用,要求有3个操作对象,称为三(元)目运算符,它是C语言中唯一的一个三(元)目运算符。
条件表达式的一般形式为:
表达式1?表达式2:表达式3
条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值,若表达式1的值为0(假),则求解表达式3,表达式 3的值就是整个条件表达式的值。
条件运算符优先于赋值运算符,赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max
max=(a>b)?a:b;
其实也可以不把条件表达式的值赋予一个变量,而在条件表达式中的表达式2和表达式3中对max赋值,并在条件表达式后面加一个分号,就成为一个独立的语句:
a>b?(max=a):(max=b); //表达式2和表达式3都是赋值表达式。
相当于:
if(a>b) max=a;
else max=b;
还可以写成:
a>b?printf("%d",a):printf("%d",b)
相当于:
if (a>b)
prirntf("%d",a);
else
printf("%d",b);
条件表达式相当于一个不带关键字if的if语句,用它处理简单的选择结构可使程序简洁。
选择结构的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套
if语句的第三种形式就属于if语句的嵌套:
if ()
if() 语句1
else 语句2
else
if() 语句3
else 语句4
应注意if与else的配对关系,else总是与它上面的最近的未配对的if配对。
为了避免二义性的混淆,最好使内嵌if语句也包含else部分,这样if的数目和else的数目相同,从内层到外层一一对应,不至出错;如果if与else的数目不一样,为实现程序设计者的思想,可以加花括号来确定配对关系。
if ()
{
if() 语句1
else 语句2
}
else
{
if() 语句1
else 语句2
}
这时“{ }”限定了内嵌if语句的范围,因此else与第一个if配对。
为了使逻辑关系清晰,避免出错,一般把内嵌的if语句放在外层的else子句中,这样由于有外层的else相隔,内嵌的else不会被误认为和外层的if配对,而只能与内嵌的if配对,这样就不会搞混;
为了使程序清晰、易读,写程序时对选择结构和循环结构对应采用锯齿形的缩进形式。
用switch语句实现多分支选择结构
switch语句多分枝选择语句,用switch来实现多分支选择结构,进行一次检查即可得到结果。
switch得到grade的值并把它和各case中 给定的值('A','B','C','D'之一)相比较,如果和其中之一相同(或匹配),则执行该case后面的语句(即printf语句),输出相应的信息;否则 执行default后面的语句,输出“输入数据有误”的信息;每个case后面后的语句中,最后一个都有break语句,它的作用是使流程转到switch语句的末尾,即右花括号处。
switch语句的作用是根据表达式的值,使流程跳转到不同的语句。
switch语句的一般形式:
switch(表达式)
{
case 常量1 : 语句1
case 常量2 : 语句2
case 常量n : 语句n
default : 语句n+1
}
switch一般形式中花括号内的“表达式”,其值的类型应为整数类型(包括字符型)。
switch下面的花括号内是一个复合语句,这个复合语句包括若干语句,语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行,case后面跟一个常量(或常量表达式),如:case 'A',它们和default都是起标号(标记、标签)作用,用来标志一个位置,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句,如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。
可以没有default标号,如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。
各个case标号出现的次序不影响执行结果,可以先出现default标号,再出现case 'D'......然后是case 'B'......。
每个case常量必须互不相同,否则会出现相互矛盾现象。
case标号只起标记的作用;在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断;在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行,最后一个case子句中可不必加break语句,因为流程已到了switch结构的结束处。
多个case标号可以共用一组执行语句:
当grade的值为'A','B','C'时都执行同一组语句,输出“>60”,然后换行。
选择结构程序综合举例
变量名尽量采用“见名知义”的原则,习惯用英语的人在阅读程序时不必解释,就很容易理解变量的含义;在scanf函数语句输入数据前,用printf函数语句输出必要的“提示信息”。