- w. ]7 ~ {+ t- q" r( k 一.学好C语言的运算符和运算顺序 - D8 w/ z" o Z _- M7 U2 ? p 1 L- l3 }/ M D. y1 k# d8 ^) T 这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。 : _. n& x( j8 {% k 1 D' S, C& e3 h. [" j# q! R3 O 先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序. ! @' V/ \2 V N: i
- q1 R: V' c" i" x, ?4 a; ^" ] 二.学好C语言的四种程序结构 ' n- G K. B% ^$ V
! t f ? ~3 B- W: i/ S (1)顺序结构 * C4 {7 |) E+ z5 Q8 D 8 M0 D# F9 U1 C& _, s/ [ 顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。 , d& R- o5 l7 y* t* q6 Q6 S
5 w* n; W) n8 J4 ]& Q 例如;a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。 & r* h5 V% r8 F2 K$ i2 w( ^
8 E0 R7 O$ X, ~0 W+ `+ G
(2) 分支结构 9 L b* r, g: u* G* `9 Y
/ y5 M7 ]! A. K' V& k; O2 {- u …… 5 j4 T( z4 k! Y1 L0 ]6 _, N) Q# s |' I+ u3 P4 r3 ~ e
else if(条件n) {分支n} - _. ]0 `. i4 ]- B/ h
1 d: a) B* w7 @4 m) `6 U/ _ else {分支n+1} * W- p" N- { h; G
7 o1 ]0 i* a7 o
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。 " R t; ^- U. h! N7 w0 e: l
% g& `/ s; Z4 d# i
④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。 2 @( O: o4 N: a8 q3 e9 I2 m+ T
1 h& K& d! ^+ f5 i" S4 _3 J4 p
(3)循环结构: ( g% D5 I" U( j3 E9 P/ C; |9 S, Y. h d( t8 D
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do ?Cwhile循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。 9 x* e/ q7 |; M, B/ T& b . G) a6 W( [$ k; ` 在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。 8 S* W. p! J2 J- v, X- C1 Z: N6 O, u* d: f9 {0 Y
顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。 ( T) |) C8 v4 O+ f* r& _' v$ j2 x. a1 d- ]: _6 k" B" S
(4)模块化程序结构 $ K% @8 w" H& b7 u1 n4 ?8 ^! j: e& N4 U: y2 Q3 ~
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。 0 B. ~- s1 u: M 5 g1 n$ E b7 p( Y& G 三.掌握一些简单的算法 & }8 X! f7 @9 B: | g
) B3 ]1 y7 ^& a. G9 E' c- c8 B" u
编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义 2 Z0 n; [0 b4 ?; ]% v! w; N1 `+ j+ N ; r7 `9 z; n9 k4 n5 J' p' @4 M% n 结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学 8 o! A% ]- b% t5 F* _' B8 T, [& g
# ]$ ~! W, y% w! z+ F4 L3 q0 ] C源程序的关键字--------------------------------------------------------------------------------------- 3 w& s* u" d3 Q4 H* Z; q7 k. {5 H1 F/ [
所谓关键字就是已被C语言本身使用, 不能作其它用途使用的字。例如关键字不能用作变量名、函数名等 + k' @2 W4 Q; K5 Y O$ e3 p
/ E) D4 g8 i6 z f [* h- G 由ANSI标准定义的C语言关键字共32个 : : F" c8 a+ h. t) X' k6 h" Q) h, f, i, c) n) ?$ O0 j9 v! u/ g
auto double int struct break else long switch % Z4 `; k/ Y6 `* Q5 H, \! j d) l
, a8 {$ [6 e6 p2 I2 W1 F
case enum register typedef char extern return union ' \3 p' g0 M7 X, n; I
2 r8 Y$ _5 e& K const float short unsigned continue for signed void & |) Q& Q" Y$ x% W0 s% k) c. @2 B) E2 f& x
default goto sizeof volatile do if while static & J# o5 o+ D0 @2 z " K7 X; G* {8 ~ 根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。 * @$ y, }' }( \ 6 y# g7 R3 z, B+ Y9 r 1 数据类型关键字 9 |' i- f$ y7 M" i. l( D; c# x
+ u; w. K& S1 B+ [6 C, H* M7 n
A基本数据类型(5个) 2 f" S& y( Q# Y8 r; M( g3 y3 H9 m2 [1 C
void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果 ! w9 [ m/ R9 z
- ]6 e, w( v/ M1 v4 S char :字符型类型数据,属于整型数据的一种 / f: H. p! e; J! b7 q9 l) u; y
int :整型数据,通常为编译器指定的机器字长 5 f% ]! i5 h5 K' l8 T( I1 P$ F) n* s/ X, R
float :单精度浮点型数据,属于浮点数据的一种 % a3 c$ i+ I! W* [8 n
) X- a( M1 M. k; @$ q
double :双精度浮点型数据,属于浮点数据的一种 - a5 t7 F8 e/ I. p8 p8 ^5 z1 ?; d& Q" `& @$ r$ m. x q- ~3 Z
B 类型修饰关键字(4个) & \2 _; A7 O, e( S3 b2 [& C6 z9 {
9 A+ l0 M" d' m, ?2 u
short :修饰int,短整型数据,可省略被修饰的int。 ; h9 K0 A! m7 E2 A" H- N6 ] % ^" g( }( V) q5 _. h. W long :修饰int,长整形数据,可省略被修饰的int。 6 f' D% g* j# m( y2 x 1 _' Z1 Z2 j2 V s j# v: |0 ^3 z0 C signed :修饰整型数据,有符号数据类型 5 [9 J4 \) O2 `& p
( A3 F2 M1 M2 k6 T8 A8 a9 V. z
unsigned :修饰整型数据,无符号数据类型 & ^% j9 ^* M" I. P9 d4 e% R; \$ A) ^
C 复杂类型关键字(5个) . U% M7 J' B7 \/ ~8 r( S. v: `
7 D% }9 J8 x& H! I; |* \6 m typedef :声明类型别名 $ W; | M4 x$ F7 \0 e; ]9 _4 O p- A2 T
sizeof :得到特定类型或特定类型变量的大小 $ ~- o" Z$ ~, x$ q* W2 ~5 n; p/ y$ G1 S
D 存储级别关键字(6个) l+ d& ~* y9 e1 {/ O
6 V3 }. L3 Y' ~; N0 d5 N" |' S. T* l
auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配 " o% y! g3 B( ?: \! c1 z- _2 g' @8 J1 q+ w. c n: r9 F
static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部 6 L! x& V6 r6 v9 E4 I2 D # \, n0 I0 c) l- E8 k register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数 3 X# H3 E% i7 W0 p3 S. |" F3 D1 I! U6 x+ x9 _. K9 K6 e0 t
extern :指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 ; `& I1 E( a( o# K$ j* J 4 s$ Y5 f2 c% v: G% g const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变) , O2 ^# ~* i0 C/ F: x$ N/ k1 n& B2 p" I0 W$ O/ h: q- d4 K g
volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值 " l( Q9 P- \9 i; i) b4 d' d
0 S% k2 S) J# d) Z4 t- i0 j# T* H 2 流程控制关键字 : M* ]2 q8 P+ I! k& p7 h. h
0 v* T. y9 I' e; Z H A 跳转结构(4个) 7 B1 K3 J! K x0 L. b5 U0 ?5 ]$ k+ K9 G. C9 v* o9 |, M* z
return :用在函数体中,返回特定值(或者是void值,即不返回值) ) d% P, m e: Y, B( n2 _) c ; k3 m# @( [8 f( @% c9 z/ h9 B continue :结束当前循环,开始下一轮循环 , y a& e3 D5 [: v+ k5 i
0 _; p m* _& d. _7 J, ~: A. N break :跳出当前循环或switch结构 6 k1 R% ?, o0 }' _; h7 V: k$ a # a4 n2 {( d$ F: b' o goto :无条件跳转语句 0 }; X# d$ b5 F" n2 u4 f }6 Q
; Y( V1 \. T" l+ f* Q x B 分支结构(5个) : j4 H2 X( Q. s9 T
! s- o7 w! S& o, ]7 ?* M/ S
if :条件语句 9 N" U" q/ m6 @. i
6 ^& {/ Q7 K0 M( n" j8 W Z# ?+ K7 i
else :条件语句否定分支(与if连用) # S' l6 v. N m 0 l; B/ [0 w+ K6 j switch :开关语句(多重分支语句) , P) _ I6 R! y% D& K4 W0 f, M) I8 I8 u% Q) u) \
case :开关语句中的分支标记 2 H0 T( M; z1 u7 G. }. Z6 U$ G( |$ e" P3 o0 F o: t& z% Y
default :开关语句中的“其他”分治,可选。 7 X& A4 z8 R$ K1 i" [
% ]9 p) Q0 v/ Q; O
C 循环结构(3个) + t6 z( ^# e. r3 j; b0 n8 H 6 u5 W9 G( F' ^ for :for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件 g6 \1 z) G; H% W5 k7 x7 b- J
* T) ^4 f1 X! \8 {: ^: N
do :do循环结构,do 1 while(2); 的执行顺序是 1->2->1...循环,2为循环条件 % a; R6 o# t- N$ p7 [ |
8 ^$ ]/ ^* _# S F) c# @+ A6 Q; d3 q/ p while :while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件 $ e3 E+ Y; F& D% ^- b g