发新话题
打印

C语言程序设计初步

本主题由 zw2004 于 2008-1-21 17:43 加入精华 
朋友别哭,要坚定自己的信心,我们一路陪伴您!!!

C语言程序设计初步

C语言程序设计
  d) H# E) ]# [/ r  G0 A6 x5 b8 G
( y: R' k; O) C2 ~8 f本课介绍C语言程序设计的基本方法和基本的程序语句。
. `8 D- S8 d/ J) A% K从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构、分支结构、循环结构。 这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。 本章介绍这些基本语句及其应用,使读者对C程序有一个初步的认识, 为后面各章的学习打下基础。
4 a; {2 o; G& t1 _: i, v! E! e3 ?' F! r) y$ v8 }/ p
C程序的语句6 Y  x1 P- r" D# O
2 B' u0 R9 \3 Z5 S! \- J
C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。1 f* e+ y9 W" j# a
C语句可分为以下五类:
  o/ ]- S$ g" b1.表达式语句; |# |0 \  J4 k  P7 T& `
2.函数调用语句
% p) V) C; d6 W" H3.控制语句. y9 F# M* w7 d0 F5 k) o
4.复合语句" K! k8 X, `* c  {7 x8 O2 ^
5.空语句- {- {! R1 E$ E1 X  m

* R/ m+ i8 ?/ R% E1.表达式语句
6 J" {% d  P' {2 I9 H' m2 Z4 A) D% y$ A
表达式语句由表达式加上分号“;”组成。其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。例如: x=y+z; 赋值语句y+z; 加法运算语句,但计算结果不能保留,无实际意义i++; 自增1语句,i值增1
, n8 m( ]& t% J$ |- ^4 t5 i! N# W  R; C7 h2 r
# [" w. s- W$ @/ m7 w, ]" h8 `
2.函数调用语句
0 o" n" k8 G8 Q4 F! l3 s7 y( |7 Y
由函数名、实际参数加上分号“;”组成。其一般形式为: 函数名(实际参数表); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。(在第五章函数中再详细介绍)例如printf("C Program");调用库函数,输出字符串。1 O4 }( l  [" ?) E. X% [

6 @6 u! Q6 X, r$ _9 k3.控制语句
4 d+ i$ f+ v+ J: L
! D1 K8 g# E( e* f- R& t控制语句用于控制程序的流程, 以实现程序的各种结构方式。% z$ T; W. u* W* s) {
它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:! i( y1 g! z" B1 `4 }
(1) 条件判断语句4 j/ u' ^% ~' B7 v
  if语句,switch语句
& i" f* {- I% |8 |* j(2) 循环执行语句
6 w' R# r( d4 I2 F* |3 g1 w  do while语句,while语句,for语句
& d6 a) v4 x' A) z$ _(3) 转向语句$ J% \3 u, g2 V. ?, O9 c5 J/ x6 h
  break语句,goto语句,continue语句,return语句
! }0 P: [6 Z; R( V
* G$ L; d3 K* e4.复合语句& O7 A1 R0 S- m) k1 |5 e

/ S  A+ R- s1 p. T, ~把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如
; Q& e* G' u2 O6 p" p9 j{
; Q$ t& ~: `6 o. k, U* lx=y+z;, }' a/ e3 a  o( q% T5 _; s
a=b+c;6 q0 s1 Y+ ?/ Q
printf(“%d%d”,x,a);
9 M* J1 W: _' l& ]3 b) ^}/ f8 Q5 Y, r5 A6 f
是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。2 y9 \6 m2 D& c" Y7 s# M

& f  ^8 m& B; Q5.空语句7 o+ L2 q4 f! ^" b  H2 C' b! l

; ^! K, C* x  L只有分号“;”组成的语句称为空语句。 空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。例如 while(getchar()!='\n'); 本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
8 u1 Y  [. {5 s* S* |  n( X) o
7 v4 C2 w1 G5 b  Q* J赋值语句
, n  n9 C1 C6 ^0 H& x, V& M3 A3 l5 v% ?  M) K" C! ~8 g' P# Z
赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为: 变量=表达式; 赋值语句的功能和特点都与赋值表达式相同。 它是程序中使用最多的语句之一。 在赋值语句的使用中需要注意以下几点:0 m$ v% I% ]6 Q" ~
- W/ h" d7 E1 K1 P2 f# w
1.由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式 变量=(变量=表达式); 是成立的,从而形成嵌套的情形。其展开之后的一般形式为: 变量=变量=…=表达式;
- Z- L! ~, G) V3 _4 g例如:
8 P! z2 v- W5 P5 k3 wa=b=c=d=e=5;按照赋值运算符的右接合性,因此实际上等效于:
5 D8 M$ C; |( P9 k$ \4 i, K7 G* ge=5;
4 L0 d% j& s- b% Z. ?5 V$ ~d=e;
$ k% I2 `7 c$ y+ S! Oc=d;: W1 @+ |, {; v- L/ v2 o
b=c;% R* s* T( X. x; `; F7 l
a=b;
, y( W1 S. i& l+ u' V  ~' [2.注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。
# [0 E8 |& {. ^! T3.在变量说明中,不允许连续给多个变量赋初值。 如下述说明是错误的: int a=b=c=5 必须写为 int a=5,b=5,c=5; 而赋值语句允许连续赋值) I3 w9 x# Y! P1 J
4.注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
+ J( d8 o( M5 \; k下述语句是合法的: if((x=y+5)>0) z=x; 语句的功能是,若表达式x=y+5大于0则z=x。下述语句是非法的: if((x=y+5;)>0) z=x; 因为=y+5;是语句,不能出现在表达式中。/ i# i: }/ T  Q) N" S1 ]! o

1 P4 A' u( g! T1 _数据输出语句) c( a7 s0 y7 U5 B8 `7 G3 \" N0 j( q
* K" s6 C" Q) I8 P9 v  f" q6 N+ n
本小节介绍的是向标准输出设备显示器输出数据的语句。在C语言中,所有的数据输入/输出都是由库函数完成的。 因此都是函数语句。本小节先介绍printf函数和putchar函数。printf函数printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式, 把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。5 v5 s  E8 }5 E+ z% R- w- d, [1 @4 W) P! ?

+ S6 ?. g9 ~: Z一、printf函数调用的一般形式
: ^2 S1 }# I+ F5 f$ B
. {  u7 f: V' N  wprintf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为: printf(“格式控制字符串”,输出表列)其中格式控制字符串用于指定输出格式。 格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如“%d”表示按十进制整型输出,“%ld”表示按十进制长整型输出,“%c”表示按字符型输出等。后面将专门给予讨论。
# U3 i5 Y- j0 n
- b8 ^/ P- x3 u- ~  g( ?非格式字符串在输出时原样照印,在显示中起提示作用。 输出表列中给出了各个输出项, 要求格式字符串和各输出项在数量和类型上应该一一对应。
1 f* ^( Q! b- s" xvoid main()2 R  X4 y& Y# r$ W
{
5 F1 z5 |5 W* h. \int a=88,b=89;
' Y" `, h& r, eprintf("%d %d\n",a,b);' e9 {; A" m2 z2 ^- x
printf("%d,%d\n",a,b);& e# N5 L) \4 ^5 V1 t9 F
printf("%c,%c\n",a,b);1 ?" O! @4 t- O/ k. b
printf("a=%d,b=%d",a,b);  z- f& H, V& A, s: L+ N
}/ a, T# e8 c9 P* a4 u# @. N0 Z
a<--8,b<--897 U% p  R) [6 B+ N* j

3 ~! M0 y- i$ Z! k5 K3 Wprintf("%d %d\n",a,b);
0 A! o3 o# _: a& L' }  nprintf("%d,%d\n",a,b);" h, N4 G2 ]/ D2 }
printf("%c,%c\n",a,b);
5 r. x+ ^) y+ e0 Aprintf("a=%d,b=%d",a,b);: y, {  ^& @, `' B% z- W+ Q& Z0 l
本例中四次输出了a,b的值,但由于格式控制串不同,输出的结果也不相同。第四行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号, 因此输出的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出 a,b值。第七行中为了提示输出结果又增加了非格式字符串。

TOP


在 @89w.org 中获取一个免费帐户

C语言程序设计初步

二、格式字符串/ U; M. p& P2 ?+ n

. u! F  K$ s/ s) K在Turbo C中格式字符串的一般形式为: [标志][输出最小宽度][.精度][长度]类型 其中方括号[]中的项为可选项。各项的意义介绍如下:
, {7 `- e$ h# Q' Z1.类型类型字符用以表示输出数据的类型,其格式符和意义下表所示:- Q: e# t; K) L5 |
表示输出类型的格式字符       格式字符意义
4 M: t7 ?  F0 H+ j2 Y$ Ud                 以十进制形式输出带符号整数(正数不输出符号)
' l! g' u( h9 q  D+ }( Ho                 以八进制形式输出无符号整数(不输出前缀O)
0 ~% ^. [  c* I6 D$ p/ D6 Yx                 以十六进制形式输出无符号整数(不输出前缀OX)
! n8 z, W8 ^; M' g' J3 Eu                 以十进制形式输出无符号整数# x& I6 i: [* x/ g# @  ?' l: y
f                 以小数形式输出单、双精度实数
7 U/ k8 h) e+ s* B' @e                 以指数形式输出单、双精度实数: b& S' \, m2 k# Q# _
g                 以%f%e中较短的输出宽度输出单、双精度实数
6 b; v0 V1 ]; W; M7 p" Gc                 输出单个字符6 Q/ j& M  ^0 i/ s* ~; {
s                 输出字符串
( R9 f+ Q1 I1 ?  l7 s2.标志
  r5 D9 V0 Y! B& J/ i标志字符为-、+、#、空格四种,其意义下表所示: 5 \1 n( m4 O" S) a& X; y& Z; G0 }! U# H
标志格式字符      标 志 意 义
4 Q+ O2 \! y" _-          结果左对齐,右边填空格
4 C9 I/ \% r& k* x$ ?+          输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
+ P0 y. u0 c- `, W' H  S#          对c,s,d,u类无影响;对o类, 在输出时加前
0 f' b; p: v! Y/ l; l* m缀o         对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点4 w  |) K: C6 F/ M! x# o( v* {, g$ d
3.输出最小宽度* k1 V1 \2 E( w" ^
用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出, 若实际位数少于定义的宽度则补以空格或0。
' [$ |) q" D+ L! h4 A- f4.精度7 E; e( L5 e% a0 `
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符, 则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
/ t: f3 ]; o! i2 Q# ]5.长度
3 @; z7 K' V3 w- A6 a6 ]$ [长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。
* B  U* n# n8 e. y; q7 qvoid main(){
- x  D% |& W. Rint a=15;
5 o' l' ?' e# j! Pfloat b=138.3576278;6 r# k$ t  L: P
double c=35648256.3645687;
$ O$ U0 k% w( t8 P  Xchar d='p';
/ Z. \7 t; u8 ]# v, K) Vprintf("a=%d,%5d,%o,%x\n",a,a,a,a);: Q9 t8 A8 s2 ]* O
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);7 q9 S# l. X1 g  w& D( c+ |% e
printf("c=%lf,%f,%8.4lf\n",c,c,c);# p! L/ q8 [+ f, I
printf("d=%c,%8c\n",d,d);& S2 v" I! U" G) F, |# m/ h
} a<--15) n9 R* M8 V4 P( T( h; f* b- R5 J$ J
b<--138.3576278
' B9 s8 o) o( M# @* c, a5 `; P$ ic<--35648256.3645687' G7 i3 v3 l4 u! f
d<--'p'  N. ]! \1 F3 p" y3 D

' e  k- W. }+ _. {  ?& Imain()- R; O; c2 n* q3 g7 S) `- m
{
- ]* B, U" k9 H, ^& U6 Z" i$ Tint a=29;. f8 C  Y5 V/ _- }& C4 M2 \
float b=1243.2341;
& s( \/ D' X* s3 Ndouble c=24212345.24232;9 U4 w3 c  K( I& I, W$ J) f1 w" o6 y
char d='h';
- g3 V: b: `1 @$ R: Nprintf("a=%d,%5d,%o,%x\n",a,a,a,a);% N6 o# ]$ s1 b6 A3 a% e' ]: Z9 g
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
( z% I3 C1 B8 W& l- Pprintf("c=%lf,%f,%8.4lf\n",c,c,c);
  t- H& j( h$ `, ]1 u) lprintf("d=%c,%8c\n",d,d);% g8 N: [3 ~1 r0 B5 S- H
}
6 Z# `" [) X% H( P. _0 c本例第七行中以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。 第八行中以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。第九行输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。第十行输出字符量d,其中“%bc ”指定输出宽度为8故在输出字符p之前补加7个空格。
/ A4 g9 w+ Q( T# a* {: o" k0 z/ [. H, g! I5 U0 P& s
使用printf函数时还要注意一个问题, 那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右, 也可从右到左。Turbo C是按从右到左进行的。如把例2.13改写如下述形式:
  ~- P# g7 m+ Xvoid main(){9 l' a: s6 o7 K8 L. b
int i=8;
% K6 K+ Y7 M2 Lprintf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--);
1 a$ r. J' i6 R3 o* |- g8 k) Z} i<--8
% h2 v# c) s3 V: x& M9 p) ^$ l' S% `
这个程序与例2.13相比只是把多个printf语句改一个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行 的。在式中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后I再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。但是必须注意, 求值顺序虽是自右至左,但是输出顺序还是从左至右, 因此得到的结果是上述输出结果

TOP



C语言程序设计初步

字符输出函数0 \! _5 [% a3 m" \- U. f* m
( b0 t/ s4 `# B. e" c
putchar 函数
( y2 d( M. T) z# K& `6 i/ H8 {% j. a1 Z' }' g0 P2 Q
putchar 函数是字符输出函数, 其功能是在显示器上输出单个字符。其一般形式为: putchar(字符变量) 例如:) c. y  u7 F) Y8 {5 z' |' ?
putchar('A'); 输出大写字母A
; Y3 E  A, u: }. o9 n4 \putchar(x); 输出字符变量x的值
) F: [! E6 D* O9 r/ N9 Q- Eputchar('\n'); 换行 对控制字符则执行控制功能,不在屏幕上显示。 使用本函数前必须要用文件包含命令:
- u9 ^6 G9 i) S/ \! w, m! M) N#include<stdio.h>. x2 r! ]( i/ ?2 h+ p% R8 u, W" f1 G
void main(){3 x2 Z; z, Q* y: [" ^
char a='B',b='o',c='k';: q4 \$ f+ u$ f3 w
putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t');
+ X' w1 w& m. i& b% oputchar(a);putchar(b);8 _+ L' X, O: x) v& T/ J% n4 W
putchar('\n');
) M" o3 l, x5 G( y7 w. [* @; Rputchar(b);putchar(c);- g" V# r% `9 G
}$ g8 I- f6 |" k# F: B, O  C- K
0 Z3 F- j8 g" y: V. O
数据输入语句( Y$ H, `6 x+ P5 ^" h

' s! ]) i1 v1 Q4 C+ D* g% u$ iC语言的数据输入也是由函数语句完成的。 本节介绍从标准输入设备—键盘上输入数据的函数scanf和getchar。 scanf函数 scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。" Y0 u3 N% \7 H

6 L7 m$ H- S/ [2 ^) Z2 H一、scanf函数的一般形式
9 s% s8 ]) u1 K6 K+ ~$ K  k
" s0 k! P* c7 W( n0 J3 hscanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串, 也就是不能显示提示字符串。地址表列中给出各变量的地址。 地址是由地址运算符“&”后跟变量名组成的。例如,&a,&b分别表示变量a和变量b 的地址。这个地址就是编译系统在内存中给a,b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系如下: &a--->a567 a为变量名,567是变量的值,&a是变量a的地址。在赋值表达式中给变量赋值,如: a=567 在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。 这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。% x; K- x$ x  @
void main(){/ P+ V  d% y( w* |2 m8 H
int a,b,c;0 p3 b5 j/ M4 _( |: \5 s9 V  q
printf("input a,b,c\n");
) P& g/ e2 s; P1 ~scanf("%d%d%d",&a,&b,&c);' ]. j2 N4 x3 g8 l' r
printf("a=%d,b=%d,c=%d",a,b,c);
! @6 R- {' Z& |8 z4 \1 D8 }} ( x- b% f2 I: C) t/ e% O4 m
注意&的用法!
. `' t# h/ `4 k" M在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入。用户输入7、8、9后按下回车键,此时,系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔, 因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。' n& G! P5 i" O$ F
如: 7 8 99 x$ g6 F( u9 \( N) m3 q0 C
) |  s$ y7 f/ M$ ]' A; e
7
1 {* W! Q* Z' ?# q  G$ ?8
; l7 c. x  [' k) U' J9
6 f0 v# [# f" g0 q格式字符串& q8 s3 U" {) l8 x0 c6 J3 k

( ~- i0 \! q- j/ q1 W& ]格式字符串的一般形式为: %
  • [输入数据宽度][长度]类型 其中有方括号[]的项为任选项。各项的意义如下:! B% H4 D+ J2 `. k/ C! t3 v0 ?
    1.类型: z) A! ^, O& ^5 d# L: H- H
    表示输入数据的类型,其格式符和意义下表所示。
    & C$ }5 _3 B2 }; _格式    字符意义
    0 G$ m: ~0 a6 ]& y+ Zd     输入十进制整数
    % r- d% T) D3 I! z( Co     输入八进制整数$ {2 T; H  K- ^6 x2 K- c& E
    x     输入十六进制整数8 [2 q/ k9 ^" L. I+ _8 Z4 [+ E
    u     输入无符号十进制整数
    ! j+ N9 e6 P0 H2 x( t1 j0 Ff或e    输入实型数(用小数形式或指数形式)
    * Q  K( D3 H, C* h9 a9 Ec     输入单个字符* N' A6 P- V8 P8 W
    s     输入字符串5 @) q6 Q0 W- Q( I
    2.“*”符
    ; k8 \2 S& P# L1 T) M; x4 o. [用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。 如 scanf("%d %*d %d",&a,&b);当输入为:1 2 3 时,把1赋予a,2被跳过,3赋予b。
    - s% B8 N; h& X9 y3.宽度
    / S$ d2 P! L4 v; w" Q用十进制整数指定输入的宽度(即字符数)。例如: scanf("%5d",&a);3 L. s6 q" {8 c. T. s( _2 Q9 @5 }  E
    输入:8 `4 f8 \% D9 P
    12345678! F- `4 A/ U& K5 D8 M) n* w$ f7 E
    只把12345赋予变量a,其余部分被截去。又如: scanf("%4d%4d",&a,&b);. M; H; b6 E# n
    输入:4 G1 j/ z' w% h- I$ a1 R% I" A
    12345678将把1234赋予a,而把5678赋予b。* ]$ U- X/ A! V2 J$ g" k
    4.长度
    # K& J/ [5 F1 p# I, t$ f长度格式符为l和h,l表示输入长整型数据(如%ld) 和双精度浮点数(如%lf)。h表示输入短整型数据。) B4 U, F' z  ~, s
    使用scanf函数还必须注意以下几点:
    - T7 ?! i9 J0 {5 M$ i2 y- ~5 @a. scanf函数中没有精度控制,如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。' N" J6 i6 F1 X
    b. scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
    4 G6 A; x0 V  g4 R4 }9 A* C9 Bc. 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
    9 [" q5 X+ o9 _d. 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:
    8 |5 M  {' g9 m0 H" cscanf("%c%c%c",&a,&b,&c);! D+ [& M* V! L; D
    输入为:
    3 W3 S/ U9 I* q# D0 d! Y8 j6 Kd e f9 t  d2 b8 E9 |( S# U
    则把'd'赋予a, 'f'赋予b,'e'赋予c。只有当输入为:
    + @% T' T3 O( C2 A6 _def& ?: t1 w% e7 g4 ?
    时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,如 scanf ("%c %c %c",&a,&b,&c);则输入时各数据之间可加空格。
    $ s# U- P+ v$ `/ D1 jvoid main(){
    2 l* @" R+ e$ n" R+ c5 N" B/ {8 ]1 Uchar a,b;8 b3 E8 x* D; l; U; V- \5 y1 y
    printf("input character a,b\n");
    / B7 k  U: Y0 O" Y8 x6 A! f: {( hscanf("%c%c",&a,&b);# s3 \8 b$ ^$ f6 l; j; x( V
    printf("%c%c\n",a,b);
    - W- n( G% s9 y+ s3 x' f- H} 5 o0 u/ Q& E1 A' c* c
    scanf("'C14F14%c%c",&a,&b);
    $ u7 T! v0 A% }8 {' m5 lprintf("%c%c\n",a,b); 由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。
    + [* F: q& b3 R& C" ]* V而输入改为MN时则可输出MN两字符,见下面的输入运行情况: input character a,b' N( C% m# o8 \* t# K: E$ J- G9 q
    MN9 i2 s  }* X: z1 P0 {
    MN. a9 a: ]8 O; K5 A: s9 I0 ^
    void main(){  M9 n: K6 W% u5 ]3 y! X* C
    char a,b;4 C7 g' u& t% S) k) W6 _
    printf("input character a,b\n");( |6 K) G, \1 }1 u$ j' S6 c
    scanf("%c %c",&a,&b);9 j5 y* F9 t* U
    printf("\n%c%c\n",a,b);9 m1 K2 y; t! T0 K1 {$ |) Q
    }5 B5 d+ ^/ y. h: N6 e  q  a
    scanf("%c %c",&a,&b); 本例表示scanf格式控制串"%c %c"之间有空格时, 输入的数据之间可以有空格间隔。e. 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。, k3 l5 L2 z' @' K% R
    例如:
    3 ^8 g$ j5 g/ {+ Oscanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“ , ”作间隔符,故输入时应为: 5,6,7
    / w  f& C9 y( I4 |" o又如: scanf("a=%d,b=%d,c=%d",&a,&b,&c);
    8 \. g+ \; b/ t则输入应为" D6 A1 R# f7 a% _" M
    a=5,b=6,c=7g. 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
    8 n* K. y& {6 }3 nvoid main(){; n- N3 ^; G. |: g) O0 j" i4 ]. R% ~6 ~
    int a;0 _7 o4 b2 w0 @- D7 C6 o6 @! l
    printf("input a number\n");
    4 Y9 G5 h* o3 ]3 [3 p; w8 t: ^scanf("%d",&a);
    8 T" l2 h/ K$ v( v* p1 g# Pprintf("%ld",a);, U( s' e+ C8 @  D8 H
    }8 J. h! V4 C2 v5 _
    由于输入数据类型为整型, 而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。如改动程序如下:
    ! C0 F6 }+ T0 dvoid main(){+ {8 S% m( D& e4 \. k
    long a;
    8 w' W: _  [5 k, D& r/ _+ |printf("input a long integer\n");, L! Y$ U/ V0 H: |0 h6 g
    scanf("%ld",&a);
    ) ^' \* I/ F# D! U" `- }printf("%ld",a);
    $ E: Y/ {/ L4 I( g, l: ~3 X8 g}+ N2 [( U2 ]/ ^
    运行结果为:/ l1 N. t- T; T& h( R0 Q; I
    input a long integer
    % g8 E7 e4 }% S9 ?- c* p2 ~" x1234567890
    & Z0 m+ L3 H; ^1234567890 当输入数据改为长整型后,输入输出数据相等。9 A) Q, E2 \- ?2 C/ J/ [( k

    ) U$ i6 @1 T0 A! S键盘输入函数
    / z! f# m9 e) Y% {( Y' Egetchar函数getchar函数的功能是从键盘上输入一个字符。其一般形式为: getchar(); 通常把输入的字符赋予一个字符变量,构成赋值语句,如:
    6 L1 b. t, d: Ychar c;
    % U' Z3 _  E* Z5 w: `; nc=getchar();
    * n9 y3 p( b7 r#include<stdio.h>8 E2 q2 M9 K* n  }- ~' d
    void main(){2 Y4 J4 K7 H$ F4 _7 y: |" y
    char c;
    , a! _4 a- x$ t" b( |" U# }  Xprintf("input a character\n");
    0 q& v" B( c  C5 G3 L& J$ P+ ic=getchar();
    . Z" P, Z) F& @6 @9 Oputchar(c);
    / a8 k1 G9 s. I$ u& F. r}
  • TOP

    

    C语言程序设计初步

    使用getchar函数还应注意几个问题:
    $ }, B0 H+ A) M' Y$ r" u1.getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。
    ) d0 p; I, R/ u; M2.使用本函数前必须包含文件“stdio.h”。
    8 H! p3 B& T" j3 v; u0 `- k3.在TC屏幕下运行含本函数程序时,将退出TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。' x, L( p' t6 ?# o. s( u3 k
    void main(){6 K- j  u' @/ S4 x
    char a,b,c;$ G( t$ p0 N$ z
    printf("input character a,b,c\n");& O$ |0 Y9 Q/ L$ A3 b$ V( \. s
    scanf("%c %c %c",&a,&b,&c);
    . e( ]; A; I$ P5 y- V5 {printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
    " p+ T8 T, M2 C7 z& G. d}
    , C; j! v6 W4 e5 [输入三个小写字母, n4 A8 o% `4 a+ E
    输出其ASCII码和对应的大写字母。
    8 W8 \* I+ Y6 a( K6 J8 Y/ K3 \2 R: ^void main(){
    % h3 C- D. ~7 i- l9 l" Mint a;" M# t* p* [+ T
    long b;
    & U- Y7 H- g! y4 ]/ Bfloat f;' _  K, [5 g& z, P
    double d;. ^4 _2 K# ?; I1 K( Y4 r, x
    char c;5 j% h! }: Y: `4 ~  P; C# N( D6 Z
    printf("%d,%d,%d,%d,%d",sizeof(a),sizeof(b),sizeof(f); T) y2 [0 _5 O7 u5 n
    ,sizeof(d),sizeof(c));
    ; y1 p- \7 u( M6 N6 D2 Y9 a! _}  C3 Q! {5 z$ a4 C
    输出各种数据类型的字节长度。
    5 B0 ~% k8 `/ k/ [, ~分支结构程序
    ) Q! z8 h* \. J% G; O: E+ @2 B8 L3 o+ j) Q# r0 r. i: E5 r  J
    关系运算符和表达式9 s, J5 y, u/ q: k5 e9 e
    " c0 `* m3 p, |5 z
    在程序中经常需要比较两个量的大小关系, 以决定程序下一步的工作。比较两个量的运算符称为关系运算符。 在C语言中有以下关系运算符:9 K& l6 i. Z/ G4 m- r2 x0 w/ F
    < 小于1 C8 b8 [: ~; u  `# g
    <= 小于或等于 ; K& ?1 k  i/ D/ Z4 c8 l
    > 大于6 U4 o& z* t& Q: k
    >= 大于或等于$ p4 ~; j  x: m# x7 v7 q, l
    == 等于
    9 R% k2 f5 M9 z; W  U" I!= 不等于 * u* @6 `3 |6 Q, Z  H  H) r
    关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。% s$ h4 }7 Q+ V! D( Z6 U
    关系表达式
    $ F3 [9 {) S9 L' F关系表达式的一般形式为: 表达式 关系运算符 表达式 例如:a+b>c-d,x>3/2,'a'+1<c,-i-5*j==k+1;都是合法的关系表达式。由于表达式也可以又是关系表达式。 因此也允许出现嵌套的情况,例如:a>(b>c),a!=(c==d)等。关系表达式的值是“真”和“假”,用“1”和“0”表示。
    , j# y$ p# m5 U7 L如: 5>0的值为“真”,即为1。(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。" m7 h8 F7 \# J0 Q
    void main(){  K: e; e. O/ ~4 n" |
    char c='k';
    9 }5 v8 B. ~4 B% Sint i=1,j=2,k=3;8 f8 ^9 ~5 r9 {* N" F4 R
    float x=3e+5,y=0.85;
    * D' [( O  N1 |7 S1 D1 T9 V1 q( zprintf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);  [4 ?" k0 v9 G* }
    printf("%d,%d\n",1<j<5,x-5.25<=x+y);# ~' |# @: c7 W7 f
    printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);/ I- X" M/ ~2 r6 _% |
    }
    & J+ s$ i; T! ochar c='k';& {* l2 ]* P7 X+ \+ R
    int i=1,j=2,k=3;3 O% q! b- @3 T. i7 h
    float x=3e+5,y=0.85;
    8 M" ?/ p) t8 y8 _0 E: ]  Q# Eprintf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);
    & ]% w4 P# Z) k) u/ C& s; Pprintf("%d,%d\n",1<j<5,x-5.25<=x+y);
    . V; U: [$ j' @; _; a9 @( tprintf("%d,%d\n",i+j+k==-2*j,k==j==i+5);
    9 q1 J, E6 z7 [) h( |! F1 [& \2 b在本例中求出了各种关系运算符的值。 字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。
    $ ?2 z4 u6 ?4 w' h: H' m7 W, R% q+ A8 e& l( O
    逻辑运算符和表达式
    6 `! j2 Q7 Y- r7 h2 d1 k
    9 J( s$ @" K0 o+ m/ t- C逻辑运算符C语言中提供了三种逻辑运算符 && 与运算 || 或运算 ! 非运算 与运算符&&和或运算符||均为双目运算符。具有左结合性。 非, n( I9 Y, I; S7 J! \+ Q
    运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下: * x$ C! Y* K) `3 u4 \+ w
    按照运算符的优先顺序可以得出:
      r  b! U; [- Ka>b && c>d等价于(a>b) && (c>d)
    ! }5 C5 z" ~6 F8 Q- @! v# S!b==c||d<a等价于((!b)==c)||(d<a); ?2 O+ {' c+ w. h& F. Y( c" b
    a+b>c && x+y<b等价于((a+b)>c) && ((x+y)<b)
      Y. M, G0 f& r1 o: F1 r逻辑运算的值
    , p' E- T+ q4 R6 B  |0 g6 t) Q逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:
    ! O6 j* ?4 J/ _" L" c1.与运算&&参与运算的两个量都为真时,结果才为真,否则为假。例如,5>0 && 4>2,由于5>0为真,4>2也为真,相与的结果也为真。+ g# J) z/ m; s* u! L3 d: @' |
    2.或运算||参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真8 L7 p0 T  b" t0 G
    3.非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。
      W+ k+ q: O3 ~* O- S4 o例如:!(5>0)的结果为假。
    ) z! R; g3 P, e0 E. f虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。; M" a' u; H) ]/ R. Y% x. @
    又如:5||0的值为“真”,即为1。5 Q" Y- Q0 s$ L! b& N
    逻辑表达式逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:(a&&b)&&c根据逻辑运算符的左结合性,上式也可写为: a&&b&&c 逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
    ' h, h3 P2 N4 ^# x- v  m8 z; d+ h5 Cvoid main(){
    ; l0 g: k4 f0 T! X2 c7 lchar c='k';
    , n# j$ \$ h6 R+ Pint i=1,j=2,k=3;# a+ f% f" I/ {! H6 Q
    float x=3e+5,y=0.85;
    9 X* Q$ S: e9 @1 o4 d0 l. j4 ?printf("%d,%d\n",!x*!y,!!!x);! l: s8 x" R# K
    printf("%d,%d\n",x||i&&j-3,i<j&&x<y);& E1 m6 {  f$ Q
    printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);9 D* v5 [0 c/ [' M
    }& r9 Y6 C+ N3 U! ~: A# N
    本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0, 该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k 由于x+y的值为非0,故整个或表达式的值为1。( y$ {( }- I9 j
    5 `6 c- {0 ?: L# ^
    if语句1 O/ M+ A% A! M
    % D2 o5 q4 N- P' O
    用if语句可以构成分支结构。它根据给定的条件进行判断, 以决定执行某个分支程序段。C语言的if语句有三种基本形式。8 n: M; F3 k1 K/ }, N
    9 E: w2 w: G2 {5 x& F* {' z
    1.第一种形式为基本形式 if(表达式) 语句; 其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图
    0 S* F. s$ h$ yvoid main(){; S; y4 P7 G5 F- P0 J, Q
    int a,b,max;: {! Z! ^; S6 \7 u2 C0 g
    printf("\n input two numbers: ");3 r7 x4 W1 h; I1 l& b. J
    scanf("%d%d",&a,&b);
    # j6 ~: q2 Z5 ~4 Qmax=a;
    - p8 v; k+ w' {4 K( M  dif (max<b) max=b;
    8 Y0 ]( v7 U4 T; O; h( Z7 zprintf("max=%d",max);2 |1 W: p- W! ?$ |$ ~
    }
    ) ^& S0 K# t9 H, p9 T" |输入两个整数,输出其中的大数。   [3 K) I: I8 P8 g% j
    scanf("%d%d",&a,&b);/ P9 y; p0 }+ S. v
    max=a;$ K6 [1 T2 `! E, p7 v
    if (max<b) max=b;7 |, g) z. \8 d0 j6 I
    printf("max=%d",max);. E3 [8 P* R3 o) K
    $ m! k3 E: M, p5 S- p* I
    本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。$ t" Z* K5 j8 b& B1 f7 o5 R
    2.第二种形式为if-else形式 ) T: T0 d6 P, M& ]
    if(表达式)
    6 |6 m3 j. y! m# C9 c语句1;
    7 |1 i( O5 d) R8 _/ Melse
    & H9 Z; u0 p5 y1 l9 R语句2;# C$ A0 M5 [% k* y
    其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。
    % f) l# u8 R$ N" qvoid main(){% L" ~$ c: W& O9 Z4 W) r5 Z+ T
    int a, b;# ~  A0 A! T  n  i' O7 j  Z+ \) r
    printf("input two numbers: ");
    ' k# t% q8 D" I/ J" Q0 tscanf("%d%d",&a,&b);
    ) a6 K2 ]8 d2 t+ g. gif(a>b)
    9 ^; s+ D3 j5 S3 z& R. ]# Rprintf("max=%d\n",a);0 F% L+ ?) C# _/ ~( W/ v6 I
    else
    ; D! M6 S. \" ]1 d, d  Vprintf("max=%d\n",b);. N. W* |: t, u5 J7 X& k5 e
    }0 t: k  o$ k% C, w
    输入两个整数,输出其中的大数。改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b.; O! L4 ?) G1 D' J5 p
    3.第三种形式为if-else-if形式# F* e2 Y# C5 ?; j8 N8 X/ Q
    前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为: 7 d# @7 u& v: Q/ E; D' ?
    if(表达式1)
    . T$ f0 u, C  m# D; {# g4 B2 C语句1; 7 D9 o2 K  [, X9 h" T4 U  S
    else if(表达式2)
    " i1 N7 B9 C; N语句2; 5 h( e- H& B1 q* X/ R! l
    else if(表达式3) / Y. ]7 J9 ?4 C9 x; }  V
    语句3;
    3 O8 x, A( T0 W, h, w, R2 J9 F, j# H9 T; M' l3 r
    else if(表达式m)
    : o) A* ?6 ?+ D" A语句m;
    " V1 S! N. _: _! W) {4 g$ [else
    9 \4 v4 s0 e" s. i语句n; * D$ S, s: ~1 F7 Y, h* [' \6 k
    其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n 。 然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。
    % o( a+ A: ^, M& R$ U#include"stdio.h"
    5 Z8 \: u6 Z1 o+ Fvoid main(){
    ) M& o% I9 {# r( A6 g  x" lchar c;" l4 @8 C5 ?1 G! f6 r4 Q
    printf("input a character: ");! o, e$ P9 _  p  _8 A
    c=getchar();
    / N! a2 O% r, Z  V! e  jif(c<32)$ \: _* ~# I1 e$ d$ X, x0 W
    printf("This is a control character\n");$ N- m6 z1 s6 X" k. K7 v2 S
    else if(c>='0'&&c<='9')
    * s8 k2 O0 U  x# }printf("This is a digit\n");
      c' ?/ M6 R( o1 \* \else if(c>='A'&&c<='Z')  a# P! p: R8 ]! U
    printf("This is a capital letter\n");3 L( K8 T) x8 _7 Y$ G, Y/ }: y0 |
    else if(c>='a'&&c<='z'). }, s% K( ]5 c' b: _- A! ?& \1 h
    printf("This is a small letter\n");4 m/ E2 p7 i8 ?- H4 c) p) H" [# U3 k
    else2 r1 K3 ?, ~' I+ u3 r# K
    printf("This is an other character\n");
    ) l, _& M7 u& g8 t6 _/ {, q0 I, u}
    $ v* ~5 ], q3 C) S' a& Q% n( _本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。

    TOP

    

    C语言程序设计初步

    4.在使用if语句中还应注意以下问题
    8 ?3 @2 T" ]8 g' c" a9 x% M6 ?
    (1) 在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如: if(a=5) 语句;if(b) 语句; 都是允许的。只要表达式的值为非0,即为“真”。如在if(a=5)…;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
    " |) S8 h; R, M* A$ E又如,有程序段: if(a=b)3 D0 ~, U5 ]( ~: }
    printf("%d",a);/ J4 w) M) H/ \  M
    else1 Z. n: w* C; D( i
    printf("a=0"); 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。, q& t8 e3 F* ?& v. `( i1 F

    0 K7 I8 E, I9 [) v4 H1 N3 z(2) 在if语句中,条件判断表达式必须用括号括起来, 在语句之后必须加分号。
    ) [1 {. u* }3 u  I! P# o: }0 I9 c
    4 ]3 C( F6 G2 K4 a, c$ O(3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{} 括起来组成一个复合语句。但要注意的是在}之后不能再加分号。
    ! ?6 O+ J6 G+ H- a* X: y, Z( ^* e例如:
    + o  y3 Q, m, M0 K/ T0 |if(a>b){$ o/ B5 e$ x# s
    a++;: h' E8 ~# H0 J6 r' a% N& F2 Q
    b++;
    6 \7 h3 X4 |/ ?6 [4 A; W}
    $ _" i3 V( a# k% p7 O0 x& zelse{7 \' K9 @# q8 ]2 g
    a=0;8 A+ F! g3 y+ j# X
    b=10;: K' z' q+ v& w7 E: y2 z
    }, l3 g8 e! ]# V/ v1 g" {0 A

    $ J% r9 B% P: u8 g' ~% F( kif语句的嵌套9 L+ C3 I9 l% Z: F( |8 w* {+ [
    8 U+ J* L+ S; ^# W4 d' Z
    当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。其一般形式可表示如下: 2 c/ a6 o$ ]5 c. x! g
    if(表达式) ( Y  D  ?; T% A' b% [) L
    if语句; ) c* r# ~% x' Z1 h; I
    或者为
    ) H7 g/ i1 e+ wif(表达式)
    7 H0 y' K5 |( Hif语句; 4 p- P  ~4 e* N! b1 q
    else : g! [5 R# Z: F# k" P$ c2 S7 V8 e
    if语句; ! M- z( w. e' q: X/ P. I. b- _
    在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:
    + S  K3 \/ I! X6 Y+ j, aif(表达式1)' h8 T+ Y5 [/ P2 F
    if(表达式2)( z& e* z" _; H4 X( f8 ?3 `
    语句1;
      u3 G5 `/ F- Xelse; C' r: W! \( W. N
    语句2;
    6 h# p+ R! ~* D+ @其中的else究竟是与哪一个if配对呢?; c9 k. y  q% g
    应该理解为:   还是应理解为: 8 o: x. m8 g# o% G4 k
    if(表达式1)    if(表达式1)' z# p* a1 v% u  I
     if(表达式2)     if(表达式2)+ _0 S' w" [7 h% [5 q1 P
      语句1;       语句1;
    # p! F8 ]2 V+ J6 `else         else. z9 V" P: b) d6 |4 _( M
      语句2;       语句2; ! e5 M* o- Z0 t7 l- `( R# q
    为了避免这种二义性,C语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。
    ! y4 ?1 t/ ?! E: Q# E+ D比较两个数的大小关系。+ R# x5 Q. [0 T- ~
    void main(){
    3 Y: N' O+ X. y4 [/ }( I: oint a,b;
    " l2 S2 _6 J+ Y/ Aprintf("please input A,B: ");
    8 t, c3 e4 _; a+ B: \4 ?scanf("%d%d",&a,&b);" k1 b+ D; u( S& C
    if(a!=b)( D* Y7 g6 H; U! b; w  }2 @8 {
    if(a>b) printf("A>B\n");
    8 r" ?  k: J: b& e) k& ?else printf("A<B\n");. V0 P: d5 x! G+ b. @
    else printf("A=B\n");  D: c* r( U$ q/ m! v
    }
    5 Y6 j# D% ]9 o& |2 q& B" m8 ~9 }本例中用了if语句的嵌套结构。 采用嵌套结构实质上是为了进行多分支选择,例3.16实际上有三种选择即A>B、A<B或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此, 在一般情况下较少使用if语句的嵌套结构。 以使程序更便于阅读理解。
    3 Q5 y0 I4 S6 h! F5 M0 ivoid main(){
    8 d) [$ W9 Q* q6 n2 F/ ?int a,b;
    9 B+ [( W. O  z' [3 s1 ^printf("please input A,B: ");' W3 V' }3 F: P
    scanf("%d%d",&a,&b);
    / Z3 @* I$ ?! b) N5 m7 ~if(a==b) printf("A=B\n");8 E3 S  w# E5 A% g
    else if(a>b) printf("A>B\n");) }' C: A) O. M3 V
    else printf("A<B\n");
    1 Z( G2 V# \! B$ a) n9 x# h}
    & j) N/ p5 ?0 u9 F
    8 B* ^: i' M+ F! O+ Q条件运算符和条件表达式
    ) M+ I- k% m+ Q0 s
    : G; B8 m/ V% s% M' n; M! w' ^$ `9 |. B如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。# x7 U8 G, B, A
    条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:# O7 l2 a" b" w& i9 a$ B
    表达式1? 表达式2: 表达式3 ( g! e5 l# y" \7 W$ E6 j
    其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。' F& V9 ]/ m& q9 g
    例如条件语句: ) w) F! l  {4 I9 ]5 q" X% B7 X
    if(a>b) max=a;# n$ }' M0 f( P  z6 r& Q( j  C) t
    else max=b;
    ' j2 V  w  ~- e' m' m+ c; D) e) U' E) O5 L可用条件表达式写为 max=(a>b)?a:b; 执行该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。5 g, f: y7 x* d: p% w% d
    使用条件表达式时,还应注意以下几点:
    8 f8 A: w: G0 O8 m. F1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b3 G) T/ ]2 D  V0 Z( b) t7 f
    2. 条件运算符?和:是一对运算符,不能分开单独使用。
    8 P3 H7 `% r$ w+ W* p3. 条件运算符的结合方向是自右至左。# g, @2 S. {; B) r6 a
    例如:
    7 p  C. U4 S8 L5 t3 z0 S/ ea>b?a:c>d?c:d应理解为0 F* {) y" i( T
    a>b?ac>d?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条
    9 F1 y) R7 u  h6 X件表达式。
    . U1 I( I) W& \* I" j- v  u7 [void main(){
    2 @& j5 Z3 I$ E2 @7 Yint a,b,max;
    2 L1 ]' h% R( f9 c$ gprintf("\n input two numbers: ");
    # U0 _( S" P/ j6 m- Tscanf("%d%d",&a,&b);
    - L- q" A/ N# L* D: xprintf("max=%d",a>b?a:b);
    ) N8 b" b4 f8 Q$ X" L}# v) }# K0 Z! f9 L0 I* h5 |' Q- ], B$ c
    用条件表达式对上例重新编程,输出两个数中的大数。

    TOP

    

    C语言程序设计初步

    switch语句
    2 n; Q. _3 G6 G% s" F9 |- e  X1 s. X# c
    C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:
    / r7 m; y# ~$ w6 e; @switch(表达式){
    9 i! ~, p; \. F! V$ X9 m; ucase常量表达式1: 语句1; 7 w( X/ f4 z( E; F/ q; Y" I3 H2 D
    case常量表达式2: 语句2; + h& ?/ T! ~) \1 t' n/ g2 q# [
    ' h6 E4 d4 L4 Z+ z7 z
    case常量表达式n: 语句n; , u! ~# a' X4 ]) `
    default : 语句n+1;
    1 ^" I( P9 E) o' J6 l} ; |& o1 J/ m1 D  i
    其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
    % f9 ^7 [# G2 f( h0 Avoid main(){
    * t6 k/ C* e, q" x4 F) R9 H. {int a;3 N+ @% f* w( q& B8 v9 h, {. R
    printf("input integer number: ");
    2 H& O8 [& c$ O( U2 Z5 {scanf("%d",&a);, ]  Z9 ]1 Y: U; ]
    switch (a){
    7 w% G' I& {  O  fcase 1:printf("Monday\n");
    ; N4 b6 z5 Q& Ecase 2:printf("Tuesday\n");
    ) Y- ]6 b( s/ Icase 3:printf("Wednesday\n");
      Y+ T% M2 {% [) V, B9 Rcase 4:printf("Thursday\n");
    , ?9 T' \$ a1 N/ y- B7 scase 5:printf("Friday\n");
    ! u! c! i5 t. m' r3 d: G4 P  m* tcase 6:printf("Saturday\n");; f. ?0 Y! O# o  B: U
    case 7:printf("Sunday\n");
    ( Z6 B8 f% \8 w' ]+ Rdefault:printf("error\n");0 Q+ i' E. F; D
    }
    # `3 d$ l6 ?* `. B}& K- X# K* o4 N( D
    3 l9 L. _0 d" Q( A6 b& _" l/ {
    本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。