a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 105|回复: 2

[C语言] C程序开发初级讲座之分支结构

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
  关系运算符和表达式- a1 h" h' A) Q" y: v
  在程序中经常需要比较两个量的大小关系, 以决定程序下一步的工作。比较两个量的运算符称为关系运算符。 在C语言中有以下关系运算符:
- h! h- m5 S, }4 Q0 Z  小于" G+ I) g4 P& x3 R
  = 小于或等于
/ o) M; k" g! S0 }; \. p( K, j0 \  大于
3 j4 C% O, E! w: q- Z  = 大于或等于
' f. K3 [' F9 p2 g' c  等于
8 e0 G: N$ P& a' i  != 不等于/ l' |- Z& j, L9 p& Y. K- C
  关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,,=,,=的优先级相同,高于和!=,和!=的优先级相同。
& f7 F7 x2 c% I5 {6 j$ v9 L8 y  关系表达式4 o0 I+ t' Y+ ~3 ~7 O4 z5 k
  关系表达式的一般形式为: 表达式 关系运算符 表达式 例如:a+bc-d,x3/2,‘a‘+1c,-i-5*jk+1;都是合法的关系表达式。由于表达式也可以又是关系表达式。 因此也允许出现嵌套的情况,例如:a,a!=等。关系表达式的值是“真”和“假”,用“1”和“0”表示。
6 F. Y% D' g' ^: \$ y  如: 50的值为“真”,即为1。由于35不成立,故其值为假,即为0。4 y$ |$ \+ y3 t: I; g
  void main, {7 {" e5 ]) u5 w( Y8 s
  char c=‘k‘;
- W+ {4 ]( f% v  int i=1,j=2,k=3;7 x6 u% w& y0 b0 a+ T& q. ~/ i, `
  float x=3e+5,y=0.85;
" Z9 w/ Q! N) x* N% k- A  printf;0 J. y' W) N5 c5 e/ ^" H1 Q$ `
  printf;
4 E1 M& c, D9 A' h+ u; G  printf;- V4 t8 V  i( O; g& L3 x: u
  在本例中求出了各种关系运算符的值。 字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如kji+5,根据运算符的左结合性,先计算kj,该式不成立,其值为0,再计算0i+5,也不成立,故表达式值为0。5 ]. i/ F/ K3 Z8 b# s9 D: V" k
  逻辑运算符和表达式2 x( t  L- }( m4 w, _( A0 w
  逻辑运算符C语言中提供了三种逻辑运算符 && 与运算 或运算! 非运算 与运算符&&和或运算符均为双目运算符。具有左结合性。 非运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示4 r+ O3 V7 H& v$ ~5 f% i# t) ~
  按照运算符的优先顺序可以得出:
+ I' q& |! h6 n8 A; m+ q2 z6 r) i  ab && cd等价于 &&
8 T  C  Y) l- i# n  !bcda等价于c)
+ q$ h: o1 ?: ?: Q7 ^  a+bc && x+yb等价于c) && b)  {- U+ E  E' w& e; d0 t
  逻辑运算的值
+ _+ X# R2 `; H  逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则1 ^1 y) B! k* A) P& O. [- o5 P
  1.与运算&&参与运算的两个量都为真时,结果才为真,否则为假。例如,50 && 42,由于50为真,42也为真,相与的结果也为真。
0 ]; b# U6 T% O; F/ ^  2.或运算参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:5058,由于50为真,相或的结果也就为真2 G7 T; I% Y( k9 C8 x+ @6 K" e
  3.非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。
: ]% ~3 g2 x# b* }- ^$ d1 n# w# F5 E  例如:!的结果为假。
! M$ @( ?* y' j' U( o' [5 g. A  虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。
  H& p; [! }" A% g3 X- A! ?  又如:50的值为“真”,即为1。
5 ~9 v5 D$ D. W! T6 W  逻辑表达式逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:&&c根据逻辑运算符的左结合性,上式也可写为: a&&b&&c 逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
7 ~1 h# a- ]8 f1 ^8 f! L7 H" A  void main char c=‘k‘;# C: k2 l; V# q0 H
  int i=1,j=2,k=3;
" \: v# D' F& G- E  float x=3e+5,y=0.85;' h- F6 P0 ~/ R  {" c- r% _* n
  printf;
' z/ J& c5 k# x3 o% ~  printf;
/ v! @& W; i# N2 L  printf,x+yi+j+k);
7 r8 R0 V- a$ n; N, x  本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故xi&&j-3的逻辑值为 1。对ij&&xy式,由于ij的值为1,而xy为0故表达式的值为1,0相与,最后为0,对i5&&c&&式,由于i5为假,即值为0, 该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ yi+j+k由于x+y的值为非0,故整个或表达式的值为1。+ B# ~+ A2 n* R- J0 w: W
  if语句; Z9 }$ J* v2 v5 P+ t( D
  用if语句可以构成分支结构。它根据给定的条件进行判断, 以决定执行某个分支程序段。C语言的if语句有三种基本形式。2 B0 O8 D2 u9 F8 C4 O9 e0 j5 z6 @8 o$ S0 Z
  1.第一种形式为基本形式 if 语句; 其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图
( {. f4 @% \; s; t8 t( [& d  void main
$ w: I% V* o- w1 Y  输入两个整数,输出其中的大数。* \8 L4 N% h3 |* x- I8 F$ ~
  scanf;
0 I' ?  a# H" N  }  max=a;
1 x( ]& {5 r, C  ifmax=b;
* a. Y* Q2 M0 S8 J* q' W7 f/ x2 x+ I  printf;
& ?# |* u; k/ m- ^- O9 I$ c  本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。
1 |; U' H2 ?7 b% a7 l  H  2.第二种形式为if-else形式( s/ T6 r# f; C. y+ m- T5 v
  if
8 a% ^- M+ s9 ^: Y2 d  语句1;  j: U" I0 b! H( p$ w. w3 k
  else
$ Z6 q0 Z0 u+ Z- q  语句2;; E; F( c9 D$ p+ H/ J& D
  其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。
+ z5 ~* @. @8 \! ]  void main- Z# V: J3 ~* g+ t  `5 E- [
  输入两个整数,输出其中的大数。改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。
5 x- D: W9 m( n: Q# o+ A5 f  3.第三种形式为if-else-if形式
! _3 f* e, K! N& e2 H0 |  j) v  前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为:
" t! S+ M1 K2 n# C) z  if& L8 C' H+ x9 _
  语句1;0 K  Z, ^0 g# q% X0 w
  else if# t# R" ^. [. _
  语句2;+ h2 X& T0 a+ a; ]' d
  else if
. w7 I; @2 `% O8 f9 @6 X0 b5 t, {  语句3;0 Y3 H3 {7 x: F# q
  …7 j$ u: }0 I  \1 Q0 A$ m
  else if
# Y( C( |! R5 Y6 K: A3 Y  语句m;7 X( }) R; E6 h" U9 ?8 G* `% {! {
  else& Q: G. l* v5 R, s  ?" a8 X6 g
  语句n;9 Z8 H0 }9 j: i5 U9 q+ Q4 K/ [4 n
  其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n 。 然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:09 | 显示全部楼层

C程序开发初级讲座之分支结构

  #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语句,从而避免输出不应有的结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:10 | 显示全部楼层

C程序开发初级讲座之分支结构

  void main
; g4 Q4 w2 T4 _7 x& ~  }
3 V1 d# O5 q1 Z+ G: Q7 `+ r  在使用switch语句时还应注意以下几点:
1 O) t3 r# E7 U  1.在case后的各常量表达式的值不能相同,否则会出现错误。; B8 q" b/ H0 N* J' _
  2.在case后,允许有多个语句,可以不用括起来。& `, [& t5 r% _* X
  3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
; m: C# |! o4 k( P  4.default子句可以省略不用。程序举例
3 y' J+ X- y% |9 u. x& o6 K/ X  输入三个整数,输出最大数和最小数。$ C  ?+ q* u/ w: i' Y% l# b8 ?
  void main, T  d9 @$ Q* c9 ?/ r
  else3 y- e. f( q/ t2 ?9 u
  if
$ X5 p5 m  Q# [. L. k* ^6 \  max=c;
$ H# e/ b' G5 K1 m- c$ r- \  else$ k7 {/ ]5 Y  I, [
  if7 p; A$ w9 x9 N- S2 d
  min=c;
; |' }  F( [9 e! e" l8 Q4 h2 L  printf;
0 `$ ?# f; y9 y* e  V3 l7 o, O  }* F  M& ~" L2 ?
  本程序中,首先比较输入的a,b的大小,并把大数装入max, 小数装入min中,然后再与c比较,若max小于c,则把c赋予max;如果c小于min,则把c赋予min。因此max内总是最大数,而min内总是最小数。最后输出max和min的值即可。 计算器程序。用户输入运算数和四则运算符, 输出计算结果。1 d+ A  Q  I" U
  void main4 G; g8 Z, r- w  d  t. n) {
  }. d* d* j6 _& L# u9 ?2 X$ n
  float a,b,s;
) b$ ]  i: j. L2 N1 `0 u: A  char c;+ ~* m! ]- q6 W& {3 o- B' V/ H
  printfb “n");
* P+ M' W) ~9 m6 H  scanf;
& J+ A. m( C2 s- E6 O7 F  switch
, N. j3 e0 J. }  Z* g" p4 O  本例可用于四则运算求值。switch语句用于判断运算符, 然后输出运算值。当输入运算符不是+,-,*,/时给出错误提示。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 11:14 , Processed in 0.220803 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表