5.1关系运算符和关系表达式
5.1.1 关系运算符
关系运算就是进行比较运算,关系运算符的功能是对两个操作数进行比较,并产生运算结果0(假)或1(真)。C语言提供的关系运算符有六种:
运算符 | 含义 |
> >= < <= == != | 大于 大于等于 小于 小于等于 等于 不等于 |
说明:
①在以上六种关系运算符中,前四种的优先级相同,后两者的优先级也相同,前四种的优先级高于后面两种。
②关系运算符的结合性是从左到右
③在C语言中,使等号代替关系运算符“==”进行关系相等判断是常见的错误。
5.1.2 关系表达式
用关系表达符将两个操作数(运算量)连接起来的式子叫做关系表达式。两个操作数(运算量)可以是算术表达式、字符表达式、赋值表达式、关系表达式和逻辑表达式等。
关系表达式的值为逻辑值,即“真”或“假”。C语言中没有逻辑性数据,以“1”表示真,“0”表示假。
为了避免出现逻辑错误,在对某变量进行关系相等或不相等的判断时,习惯于将常量或者表达式置于关系运算符的左侧。即:
常量或表达式==变量 或 常量或表达式!=变量
例如:
if(-1==a)
a++;
这个就比
if(a==-1)
a++;
好一点,能够避免出现将==写成=的情况,造成逻辑错误。
5.2 逻辑运算符
5.2.1 逻辑运算符
C语言提供了三种逻辑运算符,&&逻辑与,||逻辑或,!逻辑非。
说明:
①“&&”和“||”为双目运算符,要求有两个操作数(运算量)。当“&&”两边操作数(运算量)均为非零时,结果为1。当“||”两边的操作数(运算量)均为零时,结果为假。
②“!”为单目运算符,只要求有一个操作数(运算量)的值为非0者变0,为0者变1。
③三种逻辑运算符的优先级由高到低依次为:!、&&、||。
④逻辑运算符与其他运算符的优先次序如下:
a.关系运算符的优先级低于算数运算符,其结合方向为从左到右
b.逻辑运算符中的“&&”和“||”的优先级低于关系运算符,结合方向为从左到右;“!”的优先级高于算术运算符,其结合方向为从右到左。
c.以上三种运算符的优先级均高于赋值运算符。
如图:
!(非) 算术运算符 关系运算符 &&和|| 赋值运算符 | ↑高 | | |低 |
5.2.2 逻辑表达式
逻辑表达式是由逻辑运算符将逻辑量连接起来构成的式子。逻辑表达式的值应该是一个逻辑量,“真”或“假”。
5.3选择语句
在C语言中可以使用if语句和swith语句来实现选择结构,它可根据给定的条件,选择所给出的一组操作执行,决定语句的执行顺序。
设计分支结构应注意以下问题:
①正确设置分支的判断条件
②根据需求绘制分支流程图
③按照流程图编写程序
5.3.1 if语句
if语句是条件选择语句,它能够根据对给定条件的判断,来决定所需要的操作。
一般形式:
if(表达式)
语句1;
[else
语句2;
]
if语句的执行过程是,首先计算表达式的值,然后判断表达式的值,若表达式的值为真(非零),则执行语句1,否则执行语句2。然后退出语句,接着执行下面的语句。
5.3.2 if语句的嵌套
if语句中包含一个或多个if语句称为if语句的嵌套。if语句嵌套的一般形式:
if(表达式1)
if(表达式2)语句一
else 语句二
else
if(表达式3) 语句3
else 语句4
说明:
①在上述格式中,if与else既可以成对出现,也可以不成对出现,且else总是与最近的if相配对,这样就避免了因分支结构不同而导致程序出现二义性。在书写这种语句时,每个else应与对应的if对齐,形成锯齿形状,这样能够清晰地表示if语句的逻辑关系。此外,为了避免程序阅读困难,对于if和else下的语句段,建议一律使用大括号加以封装。例如:
if(s>=0)
{
if(s>0)
t=1;
}
else
t=0;
②阅读程序时,我们经常会遇到if语句的以下使用格式
if(表达式1) 语句1
else if(表达式2) 语句2
else if(表达式3) 语句3
...
else if(表达式n) 语句n
else 语句n+1
此结构实质上是if语句的多层嵌套,它的程序流程是在多个分支中,仅执行表达式为真的哪个else if后面的语句。若所有表达式的值为0,则执行最后一个else后面的语句。
5.3.3 switch语句
switch语句的一般形式:
switch(表达式)
{
case 常量表达式1:[语句序列1]
case 常量表达式2:[语句序列2]
...
case 常量表达式n:[语句序列n]
[default:语句序列n+1]
}
其中方括号括起来的是可选项
switch语句的执行过程是:首先计算switch后表达式的值,然后将其结果值与case后常量表达式的值依次进行比较,若此值与某case后常量表达式的值一致,即转去执行该case后的语句序列;若没有找到与之匹配的常量表达式,则执行default后的语句序列。
说明:
①switch后的表达式和case后的常量表达式必须为整型、字符型或枚举类型
②同一个switch语句中各个常量表达式的值必须互相不相等。
③case后的语句序列是一条语句,也可以是多条语句,此时多条语句不必用花括号括起来。
④由于case后面的常量表达式只起到语句标号的作用,而不进行条件判断,故在执行完某个case后的语句序列后,将自动转移到下个case继续执行,直到遇到switch语句的右花括号或break语句为止。因此,通常在每个case语句执行完后,增加一个break语句来达到终止switch语句执行的目的。
⑤case和default的次序可以交换,也就是说default可以位于case前面。并且,改变case后常量出现的次序,也不影响程序的运行结果,但从执行效率的角度考虑,一般将发生频率高的case常量放在前面。
⑥多个case可以执行同一个语句序列。
⑦switch语句可以嵌套使用,其执行过程与简单switch语句类似。嵌套switch语句中的break语句仅对当前的switch语句起作用,并不会跳出外层switch语句。
5.4 条件运算符和条件表达式
条件运算符是C语言中唯一一个三目运算符,它要求有三个操作对象。
条件表达式的一般形式:
表达式1?表达式2:表达式3
条件表达式的执行顺序是,先求解表达式1,若其值为真,则求解表达式2,整个表达式的值即为表达式2的值,若表达式1的值为假,则求解表达式3,将表达式3的值作为整个条件表达式的值。
说明:
①条件运算符的优先级低于算术运算符、关系运算符及逻辑运算符,高于赋值运算符和逗号运算符。
②条件运算符的结合性为从右到左
③条件表达式中的三个表达式的类型可以不同,当表达式2和表达式3类型不同时,条件表达式值的类型为二者中较高的类型。