如何學習C語言---編程者說之C語言

最近,老有的網友提問如何學習C語言,因此從網上搜索了一些文章,希望對大家有所幫助! e* a3 e' X7 I! C" J7 R6 }

, C4 b( Q& j6 V  談及C語言,我想凡是學過它的朋友都有這樣一種感覺,那就是讓我歡喜讓我憂。歡喜的是,C語言功能非常強大、應用廣泛,一旦掌握了後,你就可以理直氣壯地對他人說我是電腦高手!,而且以後若是再自學其他語言就顯得輕而易舉了。憂慮的是,C語言猶如少林武功一般博大精深,太難學了。其實就筆者認爲C語言並非是“difficult(困難)的,只要你能理清思路,掌握它的精髓,那麼自學C語言是一件非常容易且又其樂無窮的事。今天本人就與大家一起談談如何學習C語言或者說學習C語言應從哪幾方面着手。
( ?, v$ D% \. ]& S. V; t  J7 ^$ h: v& i! A
  瞭解一些基本知識
* o4 ]- E; x9 A6 K
! Z& v- h  t$ W5 g) D' Z  L  一.C語言的背景9 ~: t% w) V' V# }  x% g9 k7 }

4 g, C$ V; U: I; R% d  就個人感觸,無論學習哪門語言首先應該瞭解一下自己所學語言的背景,也可以說它的發展史。
2 f1 F4 S2 E, p0 O7 Y9 W9 v( e5 W! f' k7 J; k5 X
  C語言屬於高級程序語言的一種,它的前身是“ALGOL”。其創始人是布朗·W·卡尼漢和丹尼斯·M·利奇。C語言問世時是帶有很大的侷限性,因爲它只能用於UNIX系統上。然而隨着科學技術的進步,計算機工業的發展,C語言逐漸脫離UNIX1987年美國標準化協會制定了C語言的國際標準,簡稱“ANSI C”,從此以後它便成爲一種廣泛使用的程序語言。C語言的優點很多,主要的有如下四點:
8 q, f) ?* t& z* L" p+ X" P, u( U2 A" H( O2 @
  1.兼備高級語言與低級語言的優點,屬於一種中間語言。/ ]4 A# a: P8 u8 a$ v& O9 W

6 a2 O! H) V* a) O0 u  2.它是一種結構化程序設計語言,非常適合結構化程序設計。. X% t2 A/ M5 a( \( p! h

/ |& i8 x. G3 k4 }' L! U  N  3.有較豐富的數據類型、運算符以及函數供以選用。
6 c7 {. a8 `5 h
1 i, f7 y/ c- h  4.直接與內存打交道,使修改、編輯其他程序與文檔變得輕鬆,簡單。
. J7 M7 Z0 J/ @2 A  u3 A9 T" N4 }0 }  u$ i, ]( I, B' k) z  Y
  二.二大語系二種不同的學習方法
2 e3 K+ Z+ ?# I. @& B" o: h: v) J! {$ U# ?2 a: A# s# G
  筆者學習過很多程序語言,例如:CC++(C語言的擴展),QBASICVBBASIC的可視化),JAVASCRIPTJSCRIPT VBSCRIPTJAVAASPFOXPROPERL等等,就本人實踐所得,其實高級程序語言分爲兩大語系。一路是以C爲主的程序語言,例如:JAVASCRIPTJAVA等,這類語言在函數的調用,程序語句的書寫,循環的控制都極爲相似。另一路是以BASIC爲首的程序語言,例如:FOXPROVBSCRIPT等,此類語言同樣具有相似的函數調用,程序語句書寫以及循環控制,但與C語系是不同的。因此若是您以前是從QBASIC起家的,那麼在學習C語言前最好是先洗洗腦,千萬不要把學習BASIC的方法以及思路用在C身上。# E* Y0 c3 ^0 }- n2 @" u, F( M$ D
+ V  e; @; w+ }: @- I
  講到這裏,我想大家對C語言一定有了感性認識吧!下面讓我們再昇華一下,全方位親密接觸它。學習C語言必須從以下四點入手,也就是說,只要你能掌握這四點的內容,那麼基本上就大功告成了。3 w$ Q, r. t1 H# s) Z2 k
4 w4 |1 ]2 c1 {2 K4 N
* P+ N4 ]: X, _" G& U, \! V9 |
7 [0 y0 l+ R+ {7 u! S, G
親密接觸C語言
( ^" @& L9 N" U, V6 B% {
% v! c  X; h4 F8 _. P  一.輸入輸出
8 \. ?8 @9 n& V; l; c
% k9 k* ^  C# M/ I5 M/ J  C語言的輸入輸出是非常嚴格的,或許在其他程序語言中我們可以不關心這個問題,但在C語言中,我們必須要徹底瞭解它。由於篇幅有限,因此筆者不能詳談,有興趣的朋友可以參考由著名程序語言教授譚浩強先生主編,由清華大學出版社出版的《C程序設計第二版》。不過這裏筆者還是有幾點要談一下。
8 d# U0 ~/ s5 ^, f1 I# T% c7 {' I# H. C
  1.二維浮點數數組的輸入
( V/ H- i% i. ~# M- S
6 l! y; b2 W8 L5 b  二維浮點數數組的輸入(即:通過鍵盤給二維浮點數數組賦值)在很多專業書中都沒有詳細講過這個問題。在給二維浮點數數組賦值時一定要先聲明一個變量,接着把數值賦予這個變量,最後把變量數值賦予二維浮點數數組賦值。實例如下:2 w& A1 }7 Z! {. p% l4 g+ k
9 G: L: q7 H5 v3 L- v
# include "stdio.h"  m& _1 `. k% n" I, r
main()) `# u0 C4 C7 R* T- R- _
{! p6 U, m, @! ]8 S- q
 float a[2][3],x ;" S$ n$ h- X7 V  Y- l
 int i,j;" _" G+ K+ b& k4 T( H0 V3 {8 @% a. m( ]
 for(i=0;i<2;i++)7 G8 T6 s, M* O
  for(j=0;j<3;j++)0 h3 s# E4 _7 g" F# V( r% R  r/ M
   {scanf("%f",&x);! A7 G5 {- K8 @/ n
    a[j]=x;}3 n+ X! W* @) B+ C' ]- R4 T
   }, x$ n* O1 W' c$ y
不能寫成:
  C! K" H" @: ~  G, v
' [! u' z( B# O' k. c5 b3 s+ l# include "stdio.h"- U& V; W7 N% K- \) [1 K& _
main()4 V( m) u4 p) D' b/ G
{3 g( a9 y9 K6 v, z
 float a[2][3] ;5 X- s1 z8 D' k* k
 int i,j;; K, x" A: ?0 t2 k2 h
 for(i=0;i<2;i++)3 K1 N! l; \9 Q( X- m4 y3 i( [0 W
  for(j=0;j<3;j++)2 q( z) T; ]7 m0 P! r3 [* v* a
   scanf("%f",&a[j]);
2 W$ V1 b. l0 `* U- ~& M( N} / g8 a- E+ i3 T2 V+ k) v) U! I; ~
2 K1 I) \2 |8 e3 h/ P) d
  同樣道理,在結構性浮點數組變量中也一定要按照這種格式輸入。實例如下:
) ^7 v3 o6 n) f( B' T$ y" d. a4 N5 k& M) G
# include "stdio.h"
$ j0 U+ i4 d$ ^" O: }+ Q struct student6 R+ o& j5 S% t, n% _4 Q" Q
 {float b[3];/ m6 r: Q, t& v2 N6 F3 i  g/ O7 g
  int x;
: v# }/ [' T- i( S7 {* Q2 L }a[2];; H  ]" T3 F" ]0 `; t  Y
 main()
% I* b7 G! Z4 _5 N$ g' o {
# l. D( f) U3 }  float x ;
' _) C( ~- Z2 _& b  int i,j;: q& v/ F0 m' C
  for(i=0;i<2;i++)# [  g* ~$ ?4 @' }( h
   for(j=0;j<3;j++)
& D: X( X& ^5 j5 b+ k- P5 N6 l    {scanf("%f",&x);: R- e( o9 I" l: j& P
     a.b[j]=x;}$ Q& o3 i$ V4 Q% z
    } * [* ~+ [8 L4 H" R' M
" B" a- Q; K- Z6 G/ s9 w% ]3 c
  2.注意輸出格式中後的字符
! ]1 v' t* E/ _4 }, U+ x2 p- Q, ^) a
" x( u. A' c" l  V! B. `8 ~  C語言的輸出說複雜不復雜,因爲常用的都很簡單。可說不復雜也未必,記得曾在一次等級考前輔導我們C語言的教授講道:如果C語言要考得很難的話,根本不用考什麼指針,只要專考輸出格式,我想百分之九十九的學生都不及格。當時我們無不認同。從這則事例中可以看出C語言的輸出格式之複雜程度。因此大家在學習它時千萬要學會辨別輸出格式中後的字符,每個字符都有其意義,也都有其作用。
1 d3 E6 J6 j4 ^7 X7 c' x8 D
6 x2 L5 ~& Q7 D% b  二.優先級8 Y4 {0 y5 V5 `
; C0 h+ v7 y2 i2 A6 H& q
  說道優先級,有很多朋友都不是很瞭解或說很模糊。爲此筆者想先通過一個例子讓各位有個概念。什麼叫優先級?比方說,我們在公交車終點站排座隊時總會遇到70歲以上的老人不需要排隊就能上車的情景,這就是優先級的涵義。C程序在運行時也象排隊坐車一樣,首先照顧那些優先級高的運算符,若是優先級相同,那麼就象遇到兩位(或兩位以上)70歲以上的老人那樣,讓他們依次上車。但是C語言中的優先級的運算並不是千篇一律的,只能說是在大多數情況下,有些運算符的優先級有其自己的特點,因此這點大家要注意。例如條件表達式:條件?結果1:結果2,這種表達式很多朋友都知道,它的作用與IF…ELSE…條件判斷語句很雷同,它運算時的優先級就不是按照C語言的規則來完成的。所以說對於優先級各位編程愛好者一定靈活掌握,不要死記硬背。
) }4 j% s2 z' y# o. R8 j5 }6 \" I3 l4 c: s3 b, J- U
  三.指針
, m3 m' M6 |/ B: _. M5 l3 m! q. ]7 N5 c, I8 n8 k8 Y8 ]$ t$ M' O
  就個人認爲,C語言中的指針是最有特色的,當然也是最難學的。指針說穿了,其實是變量的一種表現形式,只不過這種變量記載的不是數值而是地址。就象一個人可以用姓名來表示自己,也可以用身份證號碼來表示自己一樣。筆者涉足編程已經有三年多了,在這期間曾經收到過很多網友的電子郵件詢問學習指針的方法。就本人感觸,學習指針最好是先學些計算機硬件工作的原理,例如:直接尋址,間接尋址等,只有瞭解了這些內容以後,你再學指針就比較容易理會,畢竟C語言是一門介於機器語言與高級語言中間的語言,沒有一些硬件工作知識是很難領悟它的真諦的。然而事事並非絕對,如果你沒有這些知識也不要緊,只要清楚知道以下筆者總結的二點再加上多練習便可:
$ B- C, Q+ h' Q' F6 l) Z6 _6 G3 I; ~# X8 n; D5 J: d- v
  1.指針是地址變量:它的值有兩種:其一是地址,其二是內容。不同的表達方式可以取不同的值,這有點象一個家庭地址在不同的場合標識的人物也不同。例如:父母親在他們的單位所登記的家庭地址就代表他們自己,而你在學校中登記的同樣的家庭地址就代表你自己。' U( z0 Y2 r3 S6 ?; [
% X- w6 x4 T: H; f4 m
  2.指針是可以運算的,它的運算法則與變量是一致的。: J4 n& J8 c0 m% ?  k) t
: M2 Q0 Y8 ?& x$ i2 H3 y2 ?5 O
  另外,在編寫一個程序時,除非萬不得已,一般不要使用指針變量。因爲指針是比較複雜的,用不好就當機。所以筆者建議各位對於指針只要能看懂就行,當然如果你是準備參加考試的就另當別論了。7 I* |, U/ i# k! |9 _; q# c5 z7 t1 `

% s) C  b6 i! l% w5 k, J
. A3 @6 K3 R& b: ?+ h* L四.函數
* W  O( v( @% p# ~/ N- g
, ~* Z7 t* }# m8 R5 F6 }* z9 k, s  雖說很多程序語言都有函數這一內容,但筆者覺得C語言的函數是最有魅力的。如果你能完全掌握C語言的函數,那麼學習C++就不成問題了(C++是一門建立在C語言上,但又不同於C語言的高級程序語言,它增添了很多函數。)。學習函數的方法是比較簡單的,只有兩個字牢記,即:牢記函數的功能,牢記函數的用途以及如何輸入輸出。有些朋友認爲,程序語言中的函數沒有多大用處,其實這並不正確,函數從本質上講是一段通用程序,用它可以幫助我們節約很多編程的時間,一個聰明的編程者在編寫程序前往往總是先找自己所編寫的程序中有多少是可以用函數來代替的。筆者曾經作過一個比較字符串的實驗,用C語言中的strcmp()函數只要一句話,而自己編寫的話30句話都擺不平,可想而知函數是多麼實用呀!; |( w3 f( f. D9 g
- z( C" R8 k# B' Q) K
  寫到這裏筆者該告一段落了,下面送一個本人自己用C 語言編寫的註冊表比較程序給諸位。此段程序的註釋請看“/*…*/”後的文字,程序運行時(在DOS模式下)輸入的方式如下:compare xx1.reg xxx2.reg xxx3.txt,注意字段與字段之間是有空格的。(compare是程序名)
: x3 F% {+ o% ]+ I# ?) \0 {$ n2 r9 O1 a8 s8 y3 k2 ]
  程序代碼:
. ?  s, Y4 d1 L  E8 ?3 x" R4 B' @
/ E, K: n  X- i2 A0 C3 o' Z6 v& g # include "stdio.h" /*定義頭文件或說包含文件*/
& {' W1 T6 l: H! _6 C0 ]" B2 u
5 j( }7 Y4 |) z7 W$ W main(argc,argv) /*定義帶參數的主函數*/) \. o8 d1 M! @( b' N/ `0 g7 G5 t

! M- Q, p* u- `, p& w  int argc; /*定義參數類型*/( y2 f* ?, ^, j
  char *argv[]; /*定義第二參數類型*/
! k- k/ J$ F& F3 m  { FILE *fp1,*fp2,*fp3; /*定義文件指針*/% n- v7 r# A6 u$ `
   char a,b; /*定義字符變量*/
! i/ |) k: o+ k; ~( {   if((fp1=fopen(argv[1],"r"))==NULL)
5 Q2 f' q4 Z" t1 D" A# d. Y: C! x    /*打開第一的註冊表備份文件,如果不存在則跳出程序並顯示“The file don`t open!”*/
+ ~/ |1 ^7 Q2 E+ o2 [5 Y    { printf("The file don`t open!");
( E7 l0 l' k4 x( B% A' f     exit(0); }
' S6 E; g' [" z/ Y3 S7 U   if((fp2=fopen(argv[2],"r"))==NULL) /*打開第二的註冊表備份文件,如果不存在則跳出程序並顯示    “The file don`t open!”*/
! _0 ^+ s" D; B0 ~    { printf("The file don`t open!");6 D; W" B) n% a
     exit(0);}6 [- K& V& {+ Z
   if((fp3=fopen(argv[3],"w"))==NULL) /*建立新的文本文件,用於存放比較結果。*/% t+ }  @7 |+ B% Z8 G3 ~
    {printf("The file don`t open!");
9 M3 S+ C! S5 ]/ N+ w( _( G3 z     exit(0);}, _0 _! K! T' [" X+ w$ ^
   rewind(fp1); /*規定文件指針fp1指向第一個註冊表文件頭部*/
# y' Z4 y! _( u( s2 A4 m" Q9 J! f. l% E   rewind(fp2); /*規定文件指針fp2指向第二個註冊表文件頭部*/
0 [' d4 M* Z- ~   while(!feof(fp1)||!feof(fp2)) /*開始比較*/
( L0 T& Y$ K* F' G; K+ }& h) C    { a=fgetc(fp1); /*讀取第一個註冊表文件內容並賦予給字符變量a*/+ i4 l7 }, n$ F0 T2 q' j% Y* R
     b=fgetc(fp2); /*讀取第二個註冊表文件內容並賦予給字符變量b*/
$ D0 H1 N. z- d     if(a!=b) fputc(b,fp3);
+ J+ ?7 h5 h! t& r- Q/ g      /*字符變量ab不相同的話,那麼把不同之處寫入新建的文本文件中*/
, D) R; |4 b9 s$ S' Z; V8 m      if(feof(fp1)) fputc(b,fp3); ! ?# y. t- V* c! Y
        /*如果第一個註冊表文件已經讀完,第二個文件還有未讀取部分,那麼把第二個文件的剩餘部分全部寫入新建文件中*/
% a. [. K5 A: |" W/ B" u      if(feof(fp2)) fputc(a,fp3);} /*如果第二個註冊表文件已經讀完,第一個文件還有未讀取部分,那麼把第一個文件的剩餘部分全部寫入新建文件中*/3 g% j' c+ t. O% A
      fclose(fp1); /*關閉第一個註冊表文件*/! ?0 s) }4 @; C: H! p+ G
      fclose(fp2); /*關閉第二個註冊表文件*/
/ [# q. G+ I( l( B3 e3 V     fclose(fp3); /*關閉新建文件*/
* ?$ X* T( X1 E}
4 }  P6 X% e/ m9 u$ b+ O) c6 W1 h+ \0 U: C
  對於高深莫測的C語言來說,寥寥3千字並不能說清楚的什麼問題。但只要您看了此文後,我想對於您學習此語言一定有很大的幫助,同時也能了知曉如何用最短的時間學會C語言以及掌握C語言的精髓所在。另外,此文中所涉及的知識點都是筆者通過實踐得出的,因此若是其他專業書籍沒有講到過的問題可以參考本文。最後祝大家學習C語言順利!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章