#include"stdio.h"4 W; u1 G( X$ `
void main# d s0 i1 z. ]
if
% ]$ x0 V9 C( m- b# m printf;
y( G+ G2 L. T0 ]! n else if
8 @+ v/ l% _5 _: _! q printf;: }% T( e1 @4 r+ m8 I
else if" o* x+ ~" W6 |# t, Z0 z+ a$ B
printf;
/ P" c: |6 A- \. t' T0 v9 ?4 Z7 s else if
& n% Q! ]- ~4 F+ B printf;
" x( }+ R4 V7 E else
9 s- x: U0 H, ]: T) x printf;2 y! ~; u, ?5 `3 j7 j- J, |
本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用if-else-if语句,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。9 d+ s& Z0 S+ ]' L: r2 [
4.在使用if语句中还应注意以下问题7 v+ D8 `" Q: Z+ n# p7 s
在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如: if 语句;if 语句; 都是允许的。只要表达式的值为非0,即为“真”。如在if…;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
) f4 S% n9 t3 l; R 又如,有程序段: if z5 v! ?. o% _
printf;+ i9 F5 i' z' J* \
else- y0 J6 V* I v! q! S! ]
printf; 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
8 L4 M! n4 T7 ?7 D1 t% G 在if语句中,条件判断表达式必须用括号括起来, 在语句之后必须加分号。0 c* J. W. ]! C
在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组语句,则必须把这一组语句用 括起来组成一个复合语句。但要注意的是在}之后不能再加分号。# N7 b- U2 C' f7 U7 b l- T
例如: e7 x) n: e4 a* F
if
- l% _3 @; G5 g# J: ?0 p, K S. Q0 ^ else) A7 u1 k" o/ R" ^3 |& Y
if语句的嵌套
9 E" o; ?3 |, ]: J8 e0 {+ p/ G; O 当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。其一般形式可表示1 G* l! M5 V( P; t+ r5 D/ \# I h
if
( p2 q" R- ?6 y. `( k" B if语句;
5 v$ Z7 T: E2 H3 B/ i 或者为
+ H5 c8 Q* N8 ~+ N if! y1 k& F7 Z7 C+ d" y6 n* }" }
if语句;
3 ]7 g8 @! n* [) H else6 u1 D( ?* Q. t" |4 T0 n# X
if语句;( y$ V; C; L9 }7 \% s% \! t
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:" U; y; [1 N i" r, D9 {
if$ L5 ] _) ^+ W4 {! @9 d0 s5 J. A
if
# Y' [! e6 j* {* i% | 语句1;
' ~" h) i* F2 _ else
9 ^6 w& B. N$ X3 q/ |5 D* H 语句2;7 V+ I5 Z4 _" S" w5 l0 m
其中的else究竟是与哪一个if配对呢?
, }: [) z) E: y- i7 o$ b9 Z 应该理解为:还是应理解为:0 N7 Y" Z" ?" y: ^
if if
; P& Y2 j* m: c0 O6 i if if
: l2 h# S. Z3 d# d- A2 z 语句1; 语句1;
! D3 `6 c4 B$ W" j8 ]' { elseelse7 s9 X- `4 i. d( [1 ]: F: `# V
语句2; 语句2;
# \0 G% p; O& c8 \7 y& `! l# o 为了避免这种二义性,C语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。& l. o* l8 U" s( `8 Q. `: D
void main
* B$ k. ^, z) X, z 比较两个数的大小关系。
. Q+ | I( G6 @; L' ]" x+ u printf;5 a5 @; Y7 Y, [- T
scanf;6 ^9 V- |. \9 }! n; S) h& B1 [9 D
if
5 T8 l: ~1 b# u0 ^, l if printf;
, R* f8 o9 \/ s- ` else printf;2 b8 j5 x* V# W+ N; Z' C* ^
else printf;
9 O" J4 d# e, e- z; t0 | L5 I# ? 本例中用了if语句的嵌套结构。 采用嵌套结构实质上是为了进行多分支选择,例3.16实际上有三种选择即AB、AB或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此, 在一般情况下较少使用if语句的嵌套结构。 以使程序更便于阅读理解。
, x, a% x1 ?: G) ^ void main
, X: z7 g3 n) ~, N 条件运算符和条件表达式0 p& H" `. R! ]
如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。
( H% K' h5 B, `* C, y 条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:
: N; M" K g3 ` I0 `+ C 表达式1? 表达式2: 表达式3
7 }9 N, R; L( F' n7 }! v- [ 其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。
* C1 B; \& [7 t. p/ M9 f 例如条件语句:
! L g5 A2 n5 f4 V if max=a;5 a$ b8 Z$ A7 B4 c, |, A& t3 p. F
else max=b;2 |" y0 F* h: g' d+ u
可用条件表达式写为 max=?a:b; 执行该语句的语义是:如ab为真,则把a赋予max,否则把b 赋予max。 m' J+ v: a" Y
使用条件表达式时,还应注意以下几点:
9 ~9 Q+ K0 e( }0 P( j" v5 K. G 1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=?a:b可以去掉括号而写为 max=ab?a:b
0 `- x' o5 Q- L# R# c2 Z/ O 2. 条件运算符?和:是一对运算符,不能分开单独使用。7 A$ s( H. c8 Y3 m0 n% F
3. 条件运算符的结合方向是自右至左。3 G% y+ \& W; r$ [6 K
例如:3 V( q, ~$ P; M: `- V# e( Y8 b
ab?a:cd?c:d应理解为
" ?, S6 v- Y; B0 Z ab?a: 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条$ A( a, d* j" u
件表达式。
% O, ~+ u% m3 Y void main$ k3 ^4 M8 s; k, c
用条件表达式对上例重新,输出两个数中的大数。
3 }, B: Y0 J% J* Q) x6 { switch语句
9 Z, X) S# W% L6 o- U( S. z2 ` C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:) l- P5 j. d4 J( K
switch9 X, c+ f$ g( j2 m
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
: F/ }5 i) I/ f( d void main
; Z" j. c) L \& k% d+ o2 | }
* L* }" z1 b0 }& V: o/ m" t; { 本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况, C语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。 |