白 雪 飞
baixf@ustc.edu.cn
中国科学技术大学电子科学与技术系
Dept,of Elec,Sci,& Tech.,USTC
Fall,2003
第 3章 C语言的基本语句
和程序结构设计
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 2
目 录
? 基本语句
? 关系运算符和关系表达式
? 逻辑运算符和逻辑表达式
? 分支程序设计
? 循环程序设计
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 3
基本语句 (Statements)
? 控制语句
? 表达式语句
? 函数调用语句
? 空语句
? 复合语句
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 4
控制语句
? 完成一定的控制功能
? C语言的 9种控制语句
?if-else
?while
?continue
?switch
?return
?for
?do-while
?break
?goto
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 5
表达式语句
? 形式
?expression;
?表达式最后加一个分号
? 举例
?a=3; /* 赋值语句 */
?z=x*y,z++; /* 一条语句 */
?x-y; /* 语句,但无实际意义 */
?i++; /* 语句 */
?i++ /* 表达式,不是语句 */
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 6
函数调用语句
? 形式
?function(arguments);
?函数调用后加一个分号
?函数调用语句可以看作一种表达式语句
? 举例
?printf("%d",i);
?getchar();
?myfun(a,b);
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 7
空语句
? 形式
?;
?只有一个分号
? 用法
?作为转向点
?作为循环语句中的循环体
? 举例
?for(i=1; i<=100; i++) sum+=i;
?for(i=1; i<=100; sum+=i++);
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 8
复合语句 (块语句,Block)
? 形式
?{statements}
?用 {}把若干条语句组合成为一个复合语句
?{}内可以没有任何语句,可以只有一条语
句,也可以有多条语句
?可以包括复合语句、空语句、控制语句等
? 用法
?一个复合语句当作一条语句来使用
?需要把多条语句放在只允许一条语句的场合
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 9
复合语句举例
int x,y,t;
if (x > y)
{ /* 复合语句开始 */
t = x;
x = y;
y = t;
} /* 复合语句结束 */
printf("%d,%d",x,y);
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 10
C语言语句使用说明
? 除复合语句外,语句都以分号 ;作为结束
? 语句书写格式比较自由,确定语句结束
的唯一标准是分号 (;)
? 注意区分表达式和表达式语句,它们的
用法不同
?举例,if((a=b)>0) t=a;
?错例,if((a=b;)>0) t=a;
?举例,if(x>y) {x--; y++;}
?错例,if(x>y) {x--; y++}
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 11
关系运算符 (Relational Operators)
运算符 名称 举例 优先级
(算术运算符 )
< 小于 i<100
高<= 小于等于 a<=MAX> 大于 f>3.14
>= 大于等于 c>='a'
== 等于 a==b 低
!= 不等于 x!=0
(赋值运算符 )
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 12
关系表达式
? 用关系运算符将两个表达式连接起来
?a+b>c+d,(a=3)>x
? 注意区分等于 (==)和赋值运算符 (=)
?a=b,a==b
? 关系表达式的值是逻辑值 —“真”或“假”
? C语言用整型表示逻辑值,“真” —1、
“假” —0
?举例,a=3,b=2,c=1;
d=a>b; /* d=1 */
f=a>b>c; /* f=(a>b)>c=0 */
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 13
逻辑运算符 (Logical Operators)
运算符 名称 举例 优先级
! 逻辑非 !(a>b)
(算术运算符 )
(关系运算符 )
&& 逻辑与 (x>y)&&(y>z)
|| 逻辑或 (x>3)||(x<-3)
(赋值运算符 )
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 14
逻辑运算规则
? !a
?若 a为“真”,!a为“假”
?若 a为“假”,!a为“真”
? a&&b
?若 a,b都为“真”,则 a&&b为“真”
?若 a,b不全为“真”,则 a&&b为“假”
? a||b
?若 a,b都为“假”,则 a||b为“假”
?若 a,b不全为“假”,则 a||b为“真”
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 15
逻辑表达式
? 逻辑运算符把逻辑量或表达式连接起来
?(y%4==0&&y%100!=0)||(y%400==0)
? 逻辑表达式的值是逻辑值
?用整型表示逻辑值
?“真” ?1,“假” ?0
? 把一个表达式的值作为逻辑值使用
?非零 ?“真”,零 ?“假”
?这里的非零与零,包括整型、浮点型等
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 16
逻辑表达式举例
int i=3;
char c='a';
float f=0.0;
i==0; !i; /* 两者逻辑值相同 */
i!=0; i; /* 两者逻辑值相同 */
c && !f; /*,真” */
i && 1.23 || f;/*,真” */
c && 4 && f; /*,假” */
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 17
逻辑表达式求值特点
? 逻辑表达式中的运算符,只有会影响表
达式求值时,才会执行
?a&&b&&c 若 a为“假”,则不再判断 b和 c
?a||b||c 若 a为“真”,则不再判断 b和 c
?举例,(m=a>b)&&(n=c>d)
? De Morgan定理
?!(a&&b) (!a)||(!b)
?!(a||b) (!a)&&(!b)
?!((a&&b)||c) (!a||!b)&&!c
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 18
分支程序设计
? if语句
? 条件运算符?:
? switch语句
? 分支程序设计举例
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 19
if语句的三种形式
① if(expression) statement
② if(expression) statement1
else statement2
③ if(expression1) statement1
else if(expression2) statement2
else if(expression3) statement3
...,..
else if(expressionn-1) statementn-1
else statementn
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 20
if语句的说明
? 无论哪种形式,一条 if语句,包括 else
或 else if子句,只算作一条语句
? if语句中的子句,可以是一条任何类型
的语句,包括表达式语句、空语句、复
合语句、控制语句
? 子句末尾的分号,只表示子句的结束,
不表示 if语句结束
? 注意复合语句末尾没有分号
? else子句都是可以没有的
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 21
if语句举例
if (x > y) /* y为 x和 y的较大值 */
y = x;
if (x > y) /* d为 x和 y之间的距离 */
d = x - y;
else
d = y - x;
if (x > y); /* 合法,但没有实际操作 */
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 22
if语句的嵌套
? if语句的各子句都可以又是 if语句
? 应注意 if-else的配对关系
?else总是与其上面最近的 if配对
?可以用 {}明确 if-else的配对关系
if(exp1) if(exp1)
if(exp2) {if(exp2)
statement1 statement1}
else else
statement2 statement2
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 23
条件运算符 (Conditional Operator)
? 条件运算符?:
? 条件表达式
?exp1?exp2:exp3
?先判断 exp1
?若 exp1为“真”,表达式的值为 exp2的值
?若 exp1为“假”,表达式的值为 exp3的值
?举例,max = (x>y)? x, y;
?同,if(x>y) max = x;
else max = y;
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 24
switch语句
switch (expression) {
case const-exp,statements
case const-exp,statements
...,..
case const-exp,statements
default,statements
}
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 25
switch语句的说明
? 先求 switch后表达式的值,若此值与某
个 case后的常量表达式的值相等,则跳
转到这个 case后的语句 ;若没有相等的
常量表达式,则跳转到 default
? 跳转后程序一直往下执行,不会因为遇
到另一个 case而直接跳出 switch
? 根据实际需要,可以没有 default
? 若需要跳出 switch,可使用 break语句
? case和 default的顺序不影响执行结果
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 26
switch语句举例 (1)
switch (day) { /* 打印星期的缩写 */
case 1,printf("Mon.\n"); break;
case 2,printf("Tue.\n"); break;
case 3,printf("Wed.\n"); break;
case 4,printf("Thu.\n"); break;
case 5,printf("Fri.\n"); break;
case 6,printf("Sat.\n"); break;
default:printf("Sun.\n");
}
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 27
switch语句举例 (2)
switch (deptno) { /* 根据系编号打印学院 */
case 15:
case 16:
case 17,printf("商学院 \n"); break;
case 18:
case 25,printf("人文学院 \n"); break;
case 7,printf("地空学院 \n"); break;
default,printf("其他学院 \n");
}
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 28
分支程序设计举例
? 求一元二次方程的根
?当 a=0时,不是一元二次方程
?当 a≠0时,方程的根为
? 当 b2-4ac≥0,方程有两个实根
? 当 b2-4ac<0,方程有两个共轭复根
02 ??? cbxax
aacbabx 24)2/( 2 ????
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 29
例 1:求一元二次方程的根

a =0





b
2
-4 ac =0
b
2
-4 ac > 0
输出两个实根
x
1
,x
2
输出两个复根
p + qi,p - qi
a
acbb
x
2
4
2
1
???
?
a
acbb
x
2
4
2
2
???
?
计算复根的实部
和虚部
实部 p =- b /2 a
虚部
a
acb
q
2
)4(
2
??
?
输出两
个相等
的实根
- b /2 a
输出提
示信息
|
不是二
次方程
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 30
循环程序设计
? while语句
? do-while语句
? for语句
? break和 continue语句
? 循环程序设计举例
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 31
while语句
while (expression)
statement
?while型循环
?先判断表达式,后
执行语句
?一般情况下,循环
中应含有能使循环
语句结束的操作
statement
a
b
expr,真

C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 32
while语句举例
int i,sum;
i = 1;
sum = 0;
while(i<=100) {
sum += i; /* 循环体缩进书写 */
i++; /* 使循环趋向结束 */
}
?
?
?
1 0 0
1i
is um
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 33
do-while语句
do
statement
while (expression);
?类似于 Until型循环
?先执行一次循环体
语句,后判断表达

statement
a
b
expr,真

C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 34
do-while语句举例
int i,sum;
i = 1;
sum = 0;
do {
sum += i;
i++;
}while(i<=100);
?
?
?
1 0 0
1i
is um
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 35
do-while与 Until型循环
do {
sum+=i;
i++;
}while(i<=100);
C语言形式
repeat {
sum+=i;
i++;
}until(i>100);
Until型循环
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 36
for语句
for (expr1; expr2; expr3)
statement
expr1;
while (expr2) {
statement
expr3;
}
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 37
for语句的说明
? 三个表达式的说明
?expr1,初始化
?expr2,循环条件
?expr3,一般是循环变量的改变
? 三个表达式都可以省略
?分隔表达式的分号不能省略
?expr1省略,不进行初始化
?expr2省略,认为循环条件永为“真”
?expr3省略,不在这里改变循环变量
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 38
for语句举例
int i,sum;
for (i=1,sum=0; i<=100; i++)
sum += i;
for (i=1,sum=0; i<=100; )
sum += i++;
for (i=0,sum=0; i++<100; )
sum += i;
?
?
?
1 0 0
1i
is um
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 39
break语句
? 形式
?break;
? 说明
?跳出 switch语句
?跳出本层循环语句
?如果有多层循环存在,break只跳出它所在
的那一层循环语句,不影响外层循环的执行
?不能用于循环语句和 switch语句之外的任
何其他场合
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 40
continue语句
? 形式
?continue;
? 说明
?结束本次循环
?跳过循环体中余下的其他语句,接着进行下
一次循环的判定
?只能用于循环语句中
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 41
break和 continue语句
? break语句
? 跳出 本层 循环
while(i<j){
...
if(i>100)
break;
...
}
? continue语句
? 结束 本次 循环
while(i<j){
...
if(i>100)
continue;
...
}
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 42
循环程序设计举例
? 求最大公约数和最小公倍数
),g c d (),(l c m
0)%,g c d (
0
),g c d (
bababa
bbab
ba
ba
??
?
?
?
?
?
?
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 43
例 2:求最大公约数和最小公倍数
真 假
a < 1 或 b < 1
输 入 a,b
输 出
g c d ( a,b ) = a
l c m ( a,b ) = m / a
m = a * b
当 b ≠ 0
t = a % b
a = b
b = t
输 出 信 息
|
输 入 数 据
错 误
C语言程序设计 - 第 3章 C语言的基本语句和程序结构设计 44
结束
The End