? 第一章 C语言概述
? 第二章 数据类型、运算符与表达式
? 第三章 最简单的 C程序设计
? 第四章 逻辑运算和判断选取控制
? 第五章 循环控制
? 第六章 数组
? 第八章 编译预处理
? 第九章 指针
? 第十章 结构体与共用体
? 第十二章 文件的基本操作
? 第十三章 位运算
在 C 程序的三种结构中,分支结构是一
重要结构,其中的 P 为条件
问题,条件如何表达?
逻辑运算、关系运算有哪些?
§ 4.1 关系运算符
关系运算 就是比较运算
如, a>3为一比较运算,
若 a=5,a>3成立,结果为,真”,
否则,若 a=1,a>3不成立,结果为假。
上述表达式, a>3 称为关系表达式。
4.1.1 关系运算符及其优先次序
1,<,<=,>,>=为同一优先级,= =,!=等为同一
优先级,但前者高于后者。
2,关系运算符优先级低于算术运算符。
C语言提供了六种关系运算符
< ; <= ; > ; >= ; = = ; != ;
优先级为,
3,关系运算符优先级高于赋值运算符。
如下图, 算术运算符
赋值运算符
关系运算符


例如, c>a+b ? c>(a+b)
a>b!=c ? (a>b)!=c
a= =b<c ? a= =(b<c)
a=b>c ? a=(b>c)
4.1.2 关系表达式
关系表达式的结果值规定为 1或 0,
如, a>b,a+b>b+c,(a=3)>(b=5),' a ' > ' b ',
(a>b)>(b<c)
完整的定义, 用关系运算符将两个表达式 (算术、
关系、逻辑、赋值、字符等表达式 )
连接起来的式子。
1 –– 结果为真 (成立 )
0 –– 结果为假 (不成立 )
如, 当 a=3,b=2,c=1时
(a>b)= =c
b+c<a
d=a>b
f=a>b>c
成立 1
不成立 0
则 a>b值为 1,所以 d=1,
a>b为 1,a>b>c为 0,所以 f=0,
§ 4.2 逻辑运算符和逻辑
表达式
用逻辑运算符将关系表达式、逻辑表达式连
接起来的式子 –––逻辑表达式。
4.2.1 逻辑运算符及优先级
a b !a !b a&&b a |b
真 真 假 假 真 真
真 假 假 真 假 真
假 真 真 假 假 真
假 假 真 真 假 假
三种, && (与 ),|| (或 ) ! (非 )
其意义见真值表
a&&b 当 a,b均为 1时,才为 1
a ||b 当 a,b中有一个为 1时,才为 1
!a 当 a为 1,!a为 0,反之为 1,
此处,
||和 &&为双目运算符, !为单目运算符。
优先级定义,
2,&&和 ||低于关系运算符。 !高于算术运算符
1,!(非 )优先于 &&(与 ).&&优先于 ||
即, !?&&? ||
例, !a&&b ||x>y && c
?((!a)&&b) || ((x>y)&&c)
! 高
&&
# 低
4.2.2 逻辑表达式
1,逻辑表达式的值与关系表达式值一样,真为 1,
假为 0。
例, ? a=4 则 !a 值为 0.此处只要 a ? 0,为真,则 !a值为 0,
? a=4,b=5 a&&b为 1
前面已定义了逻辑表达式,以下看一看逻辑表
达式的值及具体的运算。
? 4&&0 ||2 为 1,
总之,在逻辑运算中,非 0值参加逻辑运算时被看
成 1处理,
? a=4,b=5 a ||b为 1
? a=4,b=5 !a|| b为 1
2,一个逻辑表达式中的逻辑运算符并不是一定全部
执行,
例如,判断年号是否为润年。
如, a&&b&&c,则当 a=0(假 )时,b,c不需判断。当
a=1,b=0,则不需判 c,
又如, a ||b ||c,当 a=1时,b,c均不必判别。
润年必须满足下列条件中的任意一个,
?年号 能被 400整除。
? 年号能被 4整除但不能被 100整除。
当 (year%4!=0) ||(year%100= =0&& year%400!=0) 为 1
时,year为非润年。
设用变量 year表示年号
当 ((year%4= =0&& year% 100 !=0) ||year%400= =0)
为 1时,year为润年,否则为非润年。
如果要判别非润年可在上述表达式前加非 (!)运算符,
当 !( (year%4= =0 && year%100!=0) ||year% 400= = 0)
为 1时,year为非润年。
或者,
即,
则,
§ 4.3 if 语句 –––条件判断
4.3.1 if的三种形式
功能, 当表达式值非 0时,执行语句 A,否则不执行
语句 A,
表达式
语句 A
= 0
?0
例如,
if (x>y);
printf(" %d",x)
形式 1 if(表达式 )语句 A
其流程图,
形式 2 if(表达式 )语句 A else 语句 B
功能, 表达式为非 0,执行语句 A
表达式为 0,执行语句 B
表达式
语句 A 语句 B
? 0 = 0
例, if(x>y)
printf("%d",x);
else printf(" %d",y);
形式 3 if(表达式 1)语句 1
else if (表达式 2) 语句 2
else if (表达式 3) 语句 3
… …
else if(表达式 n) 语句 n
else 语句 n
流程,
表达 1 表达 2 表达 3 表达 n
语句 1 语句 2 语句 3 语句 n
语句 n
语句


? 0
= 0 = 0
? 0 ? 0 ? 0
如, if (3) prinf ("o.k");
if ('a')…
1,表达式可以是逻辑、关系,甚至是算术表达式。
2,语句必须以分号结束
3,若语句不止一条,则必须用 { }括起来。在 { }
外可以不用分号,
注意的问题,
#include <stdio.h>
main ( )
{ float a,b,t;
scanf ("%f,%f",&a,&b);
if (a>b)
{t=a; a=b; b=t;}
printf ("%5.2f,%5.2f",a,b);
}
例 4.1 输入两个实数,按代数值由小到大次序
输出这两个数。
3.6,–3.2?
–3.20,3.60
运行情况如下,
例 4.2 输入三个数,按大小顺序输出。
#include <stdio.h>
main ( )
{float a,b,c,t;
scanf(,%f,%f,%f”,&a,&b,&c);
if (a>b)
{t=a; a=b; b=t;}
if (a>c)
{t=a; a=c; c=t;}
if (b>c)
{t=b; b=c; c=t;}
printf("%5.2f,%5.2f,%5.2f",a,b,c);
}
运行情况如下,3,7,1?
1.00,3.00,7.00
4.3.2,if语句的嵌套
if (表达式 1)
内嵌 if
else
内嵌
注意, else与最近的 if 配对,
一般形式
在上述形式的 if语句中,又可以是 if语句 ––
–称为嵌套。
if (表达式 2) 语句 1
if (表达式 3) 语句 3
else 语句 2
else 语句 4
例, if ( )
if ( ) 语句 2
else 语句 3
if ( )
{ if ( ) 语句 1}
else

所以,必要时加 { },
if ( ) 语句 1
else
例 4.3 有一函数,
y=
–1 (x<0)
0 (x=0)
1 (x>0)
编一程序,输入一个 x值,输出 y 值。
有以下几种写法,请判断哪些是正确的?
程序 2,将程序 1的 if语句改为,
/*exp52.c*/
#include <stdio.h>
main ( )
{ int x,y;
scanf("% d",&x);
if (x>=0)
if (x>0)
y=1;
else
y=0;
else
y=-1;
printf ("x=%d,y=%d\n",x,y);
}
程序 1,
/*exp51.c*/
#include <stdio.h>
main ( )
{ int x,y;
scanf("% d",&x);
if (x<0)
y= –1;
else if (x= =0)
y=0;
else
y=1;
printf ("x=%d,y=%d\n",x,y);
}
程序 4,将程序 1的 if语句改为,
/*exp54.c*/
#include <stdio.h>
main()
{ int x,y;
scanf("%d",&x);
y=0;
if(x>=0)
if(x>0)
y=1;
else
y=-1;
printf("x=%d,y=%d\n",x,y);
}
程序 3,将程序 1的 if语句改为,
/*exp53.c*/
#include <stdio.h>
main()
{ int x,y;
scanf("%d",&x);
y=-1;
if(x!=0)
if(x>0)
y=1;
else
y=0;
printf("x=%d,y=%d\n",x,y);
}
1,程序 1 和程序 2 是正确的。
它们代表的函数为,
2,程序 3 和程序 4 是错误的。
它们代表的函数为, y=
0 (x<0)
–1 (x=0)
1 (x>0)
y=
–1 (x<0)
0 (x=0)
1 (x>0)
结论,
思考练习,分别画出一个程序的流程图
4.3.3 条件运算符
C语言提供了一个简单的条件赋值语句或
条件表达式。
问题, 当判断条件不论是,真”是,假”,
均给同一变量赋值时。
简化条件语句运算符书写方式,
, 属三目运算符。
功能, 先判表达式 1,若非 0,则值为表达式 2的值,
否则为表达式 3的值。
一般形式,表达式 1?表达式 2,表达式 3
max=a>b? a:b;
当 a>b,max ? a,否则 max?b
1,条件运算符优先于赋值运算符,
例, max=(a>b? a:b)可去掉 ( )
注意,
2,条件运算符低于关系运算符和算术运算符。
例, max=a>b? a:b+1
?max= a>b? a:(b+1)并不是
max=(a>b? a:b)+1
3,条件运算符结合性为从右至左。
如, a>b? a:c>d? c:d
相当于 a>b? a:(c>d? c:d)
4,条件表达式不能取代一般的 if语句,只有当 if 的
两 个分支为给同一变量赋值时才可替代 if,
if (a>b) printf("%d",a);
else printf ("%d",b)
由于 printf.不是表达式,故不可用条件表达式,
但可为,
printf("%d",a>b? a:b);
5,表达式 1、表达式 2、表达式 3的类型可以不同。
#include <stdio.h>
main ( )
{ char ch;
scanf ("%c",&ch);
ch=(ch>='A' && ch<='Z',? (ch+32):ch;
printf("%c",ch)
}
例 4.4 输入一个字符,判别它是否大写字母,如果是,
将它转换成小写字母;如果不是,不转换。然后
输 出 最后得到的字符。
运行结果如下,
A?
a