【例4.1】输入三角形的三条边,判断是否能构成三角形,若能则计算并输出三角形的面积,否则给出出错提示。
【例4.2】编写程序,输入x的值,按以下分段函数计算并输出y的值
y=f(x)= {1/x x!=0
{0 x=0
(运行结果1)
(运行结果2)
4.2.1 关系运算符和关系表达式
1. 关系运算符
运算符 | 含义 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
! | 不等于 |
注意:
(1)关系运算符都是双目运算符,其结合方向是左结合
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>、<、>=、<=的优先级相同,==、!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”。
2. 关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形式为
表达式 1 关系运算符 表达式 2
功能:比较两个表达式的大小,返回一个逻辑值。
例如:“a+b>=c-d”、“x<=3/2”、“ 'a'+!=c”、“-i-5*j==k+1”都是合法的关系表达式。
关系表达式中允许出现嵌套的情况,例如“ a>b>c”、“a!=(c==d)”等。
注意:
(1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0。
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于”(a>b)=0“,赋值运算符左不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结构是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”。例如关系表达式“(a=3)>(b=8)”的值为0。
【例4.3】关系运算示例。
4.2.2 逻辑运算符和逻辑表达式
1. 逻辑运算符
表4.2 逻辑运算符
运算符 | ! | && | || |
名称 | 逻辑非 | 逻辑合 | 逻辑或 |
结合性 | 右结合 | 左结合 | 左结合 |
优先级 | 高 》 | 》》》》》》 | 》 低 |
2. 逻辑表达式
用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。逻辑表达式的一般形式为:
表达式 1 逻辑运算符 表达式 2
或
逻辑运算符 表达式 1
逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。逻辑运算的真值表如表 4.3 所示。
表 4.3 逻辑运算符的真值表
x | y | !x | x&&y | x||y |
0 | 0 | 1 | 0 | 0 |
0 | 非0 | 1 | 0 | 1 |
非0 | 0 | 0 | 0 | 1 |
非0 | 非0 | 0 | 1 | 1 |
关于逻辑表达式的说明:
(1)参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是任何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式的值就确定了整个逻辑表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式值时,此后就不再计算右边的式子,这种情况称为“短路”。
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行运算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。
②对于逻辑与(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行运算;只有当“||”左边的表达式值为假时才计算右边表达式的值。
【例4.5】逻辑运算示例
算术运算符、关系运算符即逻辑运算符的优先级从高到低的顺序如表4.4所示。全部运算符的优先级和结合性见附录 B。
表 4.4 各种运算符的优先级从高到低的顺序
运算符 | ! | 算术运算符 | 关系运算符 | &&和|| | 赋值运算符 |
结合性 | 右结合 | 左结合 | 左结合 | 左结合 | 右结合 |
优先级 | 高 》 | 》》》 | 》》》 | 》》》 | 》低 |
逻辑表达式举例:
① ch是英文字母。逻辑表达式为(ch>='a' && ch<='z')|| (ch>='A' && ch<='Z')。
②a,b 不同时为 0。逻辑表达式为(a==0&&b==0)或 a!=0 || b!=0 或a || b。
③ch是空格或回车。逻辑表达式为(ch==' '||(ch=='\n'))。
④year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0 && year%100!=0)||(year%400==0)。
4.2.3 条件运算符和条件表达式
1. 条件运算符
条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,它是右结合的。
2. 条件表达式
由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为:
表达式 1 ? 表达式2:表达式3
条件表达式的执行顺序是:先计算表达式 1 的值,若值为非0,表达式为真。则将表达式 2 的值作为整个表达式的值,否则将表达式 3 的值作为整个表达式的值。
关于条件表达式的说明:
(1)条件表达式中表达式 1 的类型可以与表达式 2 和表达式 3 不同,表达式 2 和表达式 3的类型也可以不同,此时系统会自动进行转换,结果为表达式 2 和表达式 3a>b 中级别类型较高的,并将其作为条件表达式的类型。例如条件表达式“ 'a'?1:2.0 ”的结果为 double 型的1.0.
(2)条件表达式中表达式 2 和表达式 3 不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但是不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误。
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当于“a>3?b:(c>2?1:0)”。
【例4.6】用条件表达式求两个数中较大的数。
4.3 使用 if——else 实现分支结构
4.3.1 if——else 语句
1. 双分支 if 语句
其一般形式如下:
if(表达式)
语句 1 ;
else
语句 2 ;
【例4.7】使用双分支 if 语句求两个数中较大的数。
(运行结果1)
(运行结果2)
【例4.8】编写一个程序,根据键盘输入的x的值,计算 y 的值。
y=f(x)={e^x x<=1
{x*x-1 x>1
(运行结果1)
(运行结果2)
|
2. 单分支 if 语句
其一般形式如下:
if (表达式)
语句;
【例4.9】编写程序任意输入一个实数,输出其绝对值。
【例4.10】若有如下分段函数,根据x的值,求y的值。
y=f(x)={1 x!=0
{-1 x=0
(运行结果1)
(运行结果2)
【例4.11】输入3个实数,要求按小到大的顺序输出。
4.3.2 if 语句的嵌套
一个 if 语句中又包含一个或多个 if 语句的现象称为 if 语句的嵌套。
if 语句的基本形式:
if (表达式)
语句 1 ;
else
语句2;
其中“语句1”或“语句2”都可以嵌套另一个 if 语句,在缺省 else 部分的 if 语句中的“语句”也可以嵌套另一个 if 语句。因此,具体嵌套形式可以有很多种。如
if (表达式1)
if(表达式2)
语句1; }
else } 语句 1 嵌套的 if 语句
语句2; }
else
if (表达式3)
语句3; }
else } 语句 2 嵌套的 if 语句
语句4; }
【例4.12】输入 3 个任意整数,找出其中的最大值。
(运行结果1)
(运行结果2)
(运行结果3)
【例4.13】编写程序,输入一个x的值,按以下函数计算并输出y的值。
{ 1 , x>0;
y= { 0, x=0;
{ -1, x<0.
(运行结果1)
(运行结果2)
(运行结果3)
4.3.3 多分支 if 语句
多分支 if 语句是最常用的实现多路分支的方法,其一般形式如下:
if(表达式1)
语句 1 ;
else if (表达式2)
语句 2 ;
...
else if (表达式n-1)
语句 n-1 ;
else
语句 n ;
【例 4.14】编写程序,输入 x 的值,按以下分段函数计算并输出 y 的值。
{ 2x x<2
y= { 7-3x 2<=x<=10
{ 1-cosx x>10
【例4.15】编写程序由键盘输入一个字符,若该字符为小写字母,则将其转换为大写字母;若该字符为大写字母;则将转换为小写字母;否则将其转换为 ASCII 码表中该字符的下一个字符。
(运行结果1 )
( 运行结果2)
4.4 使用 switch 语句实现分支结构
在C语言中还提供了一种 switch 语句也可以实现多分支的选择。
switch 语句的一般形式如下:
switch (表达式)
{
case 常量表达式 1:语句 1;break;
case 常量表达式 2:语句 2;break;
...
case 常量表达式 n: 语句 n ;break;
default:语句 n+1;break;
}
图 4.6 switch 多分支结构执行流程
关于 switch 语句的几点说明:
(1)switch 后的表达式可以是任何表达式,其值只能为整型、字符型、枚举型(见9.8节)之一。
(2)每个 case后面的常量表达式的值互不相同,否则就出现互相矛盾的现象。
(3)各个 case和 default 的出现次序不影响执行结果。
(4)可以让多个 case 共用一组执行语句 。
(5) switch 语句允许嵌套使用。
1. 在 switch 语句格式中的每个语句后面都使用 break 语句
【例 4.16】编写程序,输入一个月份值,输出该月份是第几季度。
运行结果
2. 在 switch 语句格式中的部分语句后面使用 break 语句
【例4.8】使用 switch 语句编写例4.14的程序。