linux系統C語言學習總結

引言

  盡管 C 語言問世已近 30 年,但它的魅力仍未減退。C 語言繼續吸引著眾多的開發者,他們為了編寫、移植或維護應用程序而必須學習新技能。

  本文是為了滿足對C語言初學者或想提高自身C語言修為的開發人員的需要而寫的。希望對您的學習和工作有所幫助。您也許不贊同其中的某些方法,但我們希望您會喜歡其中的一些。

  本文不介紹作為一個程序員應掌握得語言細節,而是與初學者分享自己的UNIX 下C語言編程學習經驗;也不說明一個合格的編程人員應該掌握的計算機知識,比如:操作系統、數據結構與算法、數據庫等等。

  不管您出于什么目的,希望您閱讀完本文后能留下您的批評或建議。您的中肯的批評會成為作者前進的動力。

工具篇

  “公欲善其事,必先利其器”。編程是一門實踐性很強的工作,在你以后的學習或工作中,你將常常會與以下工具打交道, 下面列出學習C語言編程常常用到的軟件和工具。

  (一) 操作系統

  在UNIX或Linux系統中學習C很方便,所以在開始您的學習旅程前請先選擇一個UNIX或Linux操作系統。

  目前可供個人免費使用的UNIX或Linux系統有FreeBSD、CentOS、Ubuntu、SUSE Linux等,如果你以前沒有接觸過UNIX或Linux選擇Ubuntu還是比較好,因為它的軟件非常豐富,當然了如果你想以后一直在Linux工作學習建議選擇CentOS,而且在安裝包中還提供很多實用的工具,如:gcc, make等。

  如果您一直使用Windows,身邊又沒有多余的機器安裝UNIX,則可以使用VMware,通過VMware安裝虛擬系統。

  (二) 編譯工具

  目前絕大多數Unix或Lnux系統都提供CC或GCC編譯器,最簡單的cc命令格式如下:

  cc -o hello hello.c

  在unix shell環境中敲入上面的代碼會將hello.c程序編譯成可執行文件hello。

  make 工具如 GNU make、System V make 和 Berkeley make 是用來組織應用程序編譯過程的基本工具,但是每個 make 工具之間又有所不同。

  大部分UNIX和Linux程序都是通過運行make來編譯的。make工具會讀取一個包含指令的文件(這個文件的名字通常都是 makefile 或 Makefile,不過后文中我們統一稱之為 “makefile”),并執行各種操作來編譯程序

  (三) 調試工具

  最簡單的調試工具:為你的程序添加打印語句

  在你對程序的運行機制有了一定的了解后,你可以實用一些工具幫助你進行調試,當然你得學習一下這些工具得使用,如:dbx,gdb等。

  還有一些內存工具可以幫你查找內存泄漏或緩沖區溢出等一些問題,如:memwatch,yamd等

  (四) 其他工具


  1.vi或vim(vim是vi的升級版)

  Unix下文本編輯器。主要靠一堆命令來編輯文本文件,學Unix編程最好熟悉并熟練使用vi編輯器。

  當然在實際工作中,你可能需要一個集成編碼環境或一個功能強大的圖形化編輯工具。

  提供一個中文的vim在線手冊:http://www.slideshare.net/kinghom/vim-1922665

  2.netterm

  最著名的網絡終端軟件之一,可以使用它方便的連接到主機系統中。

  3.Secure shell

  一個支持ssh協議得客戶端工具,多數情況下用來連接linux系統。

書籍篇

  “書是人類進步得階梯”。學習一門新的知識,當然要選擇幾本適合自己得書籍,下面介紹一些我自己學習C語言使用過的書籍:

  1.《C primer plus》

  推薦理由:適合作為入門書和基本函數查詢得參考資料。本書最新版為第五版,以ANSI C99為標準詳細介紹了C語言。

  2.《The C programming_Language》

  推薦理由:C語言之父得作品權威性毋庸置疑。雖然書籍出版時間比較老,好像也沒更新,不過仍不失為經典書籍,網上有這本書得英文電子版提供下載。

  3.《C 專家編程》

  推薦理由:本書可以幫助有一定經驗的C程序員成為C編程方面的專家,最關鍵的是本書寓教于樂,讓你充分享受編程的樂趣。

  4.《C缺陷與陷阱》

  推薦理由:書中所揭示的知識能幫助您繞過C語言自身得陷阱和缺陷,減少代碼中許多常見的Bug。

  5.《unix環境高級編程》

  推薦理由:既然是UNIX環境下C編程,就不得不說說UNIX編程書籍。Stevens先生的《unix環境高級編程》是我竭力推薦的,也是我的案頭必備(如果對網絡編程有興趣的,可以學習一下Stevens先生的《UNIX網絡編程》兩卷,如果覺得還不過癮,可以再看看《TCP/IP詳解》三卷)。

  6.《計算機編程藝術》

  推薦理由:算法大師得嘔心瀝血之作。計劃出版五卷書,目前好像已出版3卷。對算法有興趣得可以研究一下。

過程篇

  1. 學習C語法

  語法的學習對于一個具有編程底子的來說,就很輕松了;即使你以前沒有學習過其他編程語言,我相信有2個星期,你也能輕松搞定。

  需要注意的是,不要太糾纏于語言的細節,比如:運算符優先級與結合性的問題等。

  2. 學習C標準庫

  ANSI C庫把函數分為不同的組,每個組都具有與之相關的頭文件。C語言標準庫相對于其他語言,比如C++,Java來說是非常短小精悍的,但首先應著重對以下庫進行學習:

  ctype.h:字符處理

  math.h:數學庫

  stdio.h:標準I/O庫

  stdlib.h:通用工具庫

  string.h:字符串處理

  time.h:時間和日期

  如果想了解完成的ANSI C庫,你可以購買相關的書籍,這些書籍一般會詳細介紹每個函數的用戶和一些注意點。

  3.攻克C的難點

  C語言聲明:

  C語言的聲明確實讓我覺得恐怖,比較晦澀難懂,而且聲明的形式和使用的形式還類似。比如如下的聲明恐怕就連很多熟悉C多年的程序員也不是一眼就能看出來的:

  char * const * (*next)();

  那么有沒有一種好的記憶方法或規則來搞清楚呢,好像沒有,如果有的話也不是這樣折磨人了。不過可以看看《C專家編程》第三章的內容,或許你會有所收獲。也只能多學多練了,所謂熟能生巧嘛,希望這個問題不要在你的心靈上留下陰影。

  數組與指針:

  數組與指針的關系,在標準中并沒有作很詳細的規定,而且好多C入門的書籍在這個問題上并沒有給出很詳細的說明,所以會給人造成很多誤解。

  對于這個問題,你可以參考《C缺陷與陷阱》4.5節和《C專家編程》第4,9,10章,相信你這里面的內容搞透徹,以后就不會再被這個問題搞迷惑。

  指針與內存:

  如果你以后編寫規模較大的程序,你可能發現這個問題可能會是你最大的煩惱,而且可能會是你消耗最多調試時間的事項。

  C版本的問題:

  你得特別小心該問題,最好不要在你的程序中混合使用不同版本C的特性,否則會給你帶來很迷惑的問題。如果一定要用,你最好清楚自己在做什么。

  還有一些其他C中的難點和容易錯誤的地方,可以學習前人的一些經驗。以下是一個c FAQ的鏈接地址,相信在這篇文檔中有你需要的大部分問題的解決方法。

  http://c-faq-chn.sourceforge.net/

  4.UNIX環境編程

  學習了以上內容之后,我相信,你就可以進行unix環境編程了。不過你可能需要對操作系統理論有一點點的了解,這樣學起來會比較輕松一些。

  Unix環境編程,你應該著重IO和進程兩大塊內容。《Unix環境高級編程》中對Unix環境編程有著非常詳細且深入的論述,而且書中有大量實用性例子程序,不過可能得花上幾個月得時間,好好啃一啃了。

  在扎實掌握以上內容,不代表你得C語言學習支路已經完成,相反,才剛剛開始。以后你需要用學到得知識去解決大量不同實際問題,在不斷得實踐過程中,你會近一步加深對C的理解。有了以上基礎之后,你會發現,在實踐過程中需要的其他知識,你會非常快速的掌握。

方法篇

  編程是一個實踐性很強的工作,最好的學習方法就是邊看書邊調試代碼,把書上的例子程序反復的修改調試運行,從中得到自己的體會。 在自己的學習或工作中寫的一些測試的程序,要分門別類的保存下來,在以后的實際工作中不斷的整理,日積月累就是一個很好資源庫了。

  有時候,可能會覺得書上的例子作為理解概念時比較通俗易懂,但實用價值不高。所以要提高自己的編程能力,你還需要學習別人的代碼,我認為研究別人的代碼是提高自己實際編程能力最好且最快的途徑,現在網絡上有很多價值很高的開源代碼可供你選擇學習。

  最后,不得不提到的一個問題就是,千萬不要讓自己淹沒在各種技術細節的海洋中,比如前綴++運算符問題,表達式計算優先級問題等。

  學習UNIX下C編程也好,還是其他編程語言,我們最后的目標都是為了使用計算機解決現實中的問題,所以積累日常工作中常見問題的解決方法,并形成一定的范式,做一些提煉才是最重要的。說到底,設計和編程所做的事情,就是方法論,不管你是無意識還是有意識的,所以一定要注重積累。

補充說明


  1. 對于有人問是否需要一份ANSI C99標準,對于一般開發人員,并沒有必要,且不說其語言晦澀難懂,即使你能從頭到尾學習一遍,我想對你的編程也沒有什么提高。

  2.目前多數UNIX操作系統所帶的cc、gcc等編譯器好像并不支持C99的所有新特性,不過現在已經有足夠多的新特性普遍可用,因此有理由開始認真考慮在新的開發中采用C99特性,尤其是用在它們使得效率或清晰度本質上發生變化的那些地方(比如以內聯函數代替宏替換)。

  3.編程規范的問題:一般較為正規的軟件公司都會有自己的一套完成的編程規范,那么你遵守就好;如果你是自己學習的話,可以選擇一個較為通用的規范,最好的方法就是看別人是怎么寫代碼的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/451316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451316.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis 刪除操作

Redis 鍵(key) Redis 鍵命令用于管理 redis 的鍵。 語法 Redis 鍵命令的基本語法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME 實例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> DEL runoobkey (integer) 1 在以上實例中 DEL 是…

寫給大數據開發初學者的話2

見 : http://lxw1234.com/archives/2016/11/782.htm 如果你已經按照《寫給大數據開發初學者的話》中第一章和第二章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點: 0和Hadoop2.0的區別;MapReduce的原理(還是那個…

Pandas的結構和應用

Pandas處理以下三個數據結構 - 系列(Series)----一維ndarray   特點:帶有標簽,可以使用標簽作為索引,大小不能改變,內部數據可以改變。 屬性:與NumPy類似,多了一個軸標簽axis lables 數據…

JZOJ5857 【NOIP提高組模擬A組2018.9.8】沒有上司的舞會

題目 Description “那么真的有果爾德施坦因這樣一個人?”他問道。 “是啊,有這樣一個人,他還活著。至于在哪里,我就不知道了。” “那么那個密謀——那個組織?這是真的嗎?不是秘密警察的捏造吧?” “不是,這是真的。我們管…

python 中如何判斷list中是否包含某個元素

在python中可以通過in和not in關鍵字來判讀一個list中是否包含一個元素 theList [‘a’,’b’,’c’] if ‘a’ in theList: print ‘a in the list’ if ‘d’ not in theList: print ‘d is not in the list’

時間即財富:創業者浪費精力的八個錯誤

導讀:本文作者Jeff Miller是美食網頁應用Punchfork的創始人,同時也是DuckDuckGo、Ginzametrics、Art.sy、DataMinr以及Forkly的投資人。作者通過對自己創業初期一些錯誤選擇進行盤點,告訴讀者在創業初期應該學會選擇,因為在創業初…

寫給大數據開發初學者的話3

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 如果你已經按照《寫給大數據開發初學者的話2》中第三章和第四章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識…

十五周二次課

18.6 負載均衡集群介紹 主流開源軟件LVS、keepalived、haproxy、nginx等其中LVS屬于4層(網絡OSI 7層模型),nginx屬于7層,haproxy既可以認為是4層,也可以當做7層使用keepalived的負載均衡功能其實就是lvslvs這種4層的負…

LeetCode--171--Excel表列序號

問題描述: 給定一個Excel表格中的列名稱,返回其相應的列序號。 例如, A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1: 輸入: "A" 輸出: 1示例 2: 輸入: "AB" 輸出: 28示例 3: 輸入: "…

中國歷代王朝大排名

中國自秦以降,一共出過九個大王朝,它們是:秦、漢、晉、隋、唐、宋、元、明、清。另外,還出過五十幾個小王朝,它們是: 三國時的魏、蜀、吳,共三個; [ 轉自鐵血社區 http://bbs.tiexue…

寫給大數據開發初學者的話4

見:http://lxw1234.com/archives/2016/11/795.htm 如果你已經按照《寫給大數據開發初學者的話3》中第五章和第六章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點: 為什么Spark比MapReduce快。使用SparkSQL代替Hive&#xff…

TPS及計算方法

TPS (transaction per second)代表每秒執行的事務數量,可基于測試周期內完成的事務數量計算得出。例如,用戶每分鐘執行6個事務,TPS為6 / 60s 0.10 TPS。同時我們會知道事務的響應時間(或節拍),以此例,60秒完成6個事務…

域名解析服務之DNS查詢類型

在實際應用中DNS查詢主要分為兩種方式查詢:1.遞歸查詢;2.迭代查詢 一般情況下:為了減少資源的消耗,網絡中客戶端與所屬的本地DNS服務器查詢方式通常為遞歸查詢,本地DNS服務器與外部的公共DNS服務器間的查詢方式為迭代查…

MFC Ribbon界面設計

Ribbon是類似于office2007樣式的界面,它替代了傳統的MFC程序里的菜單和工具欄 MFC默認生成的Ribbon功能少,需要我們自己添加一些控件和圖片等元素使界面好看 看下面的一個界面,是VC2010示例里的 看到它與默認Ribbon樣式的區別: 工…

互聯網手機躁動:“周大炮”追逐“雷布斯”

摘要:周鴻祎選擇非自有品牌補貼,可能是看到了小米初期的艱難,也想追求速度,繞開自制手機終端環節。于小米而言,需要解決后續機型承接、持續穩定提升產能;對360而言,需要投入巨量補貼資金&#x…

獲取泛型T的ClassT clazz

在我們搭建框架中往往會用到泛型,我們知道泛型的好處是在編譯的時候檢查類型安全&#xff0c;并且所有的強制轉換都是自動和隱式的&#xff0c;代碼的重用率高 然而有時候<method>的入參并不能直接強制轉換成泛型的類型,比如說下面這段代碼&#xff1a; 很明顯String 類…

寫給大數據開發初學者的話5

見&#xff1a;http://lxw1234.com/archives/2017/01/832.htm 至此&#xff0c;你的大數據平臺底層架構已經成型了&#xff0c;其中包括了數據采集、數據存儲與計算&#xff08;離線和實時&#xff09;、數據同步、任務調度與監控這幾大模塊。接下來是時候考慮如何更好的對外提…

3.spring boot Controller獲取請求參數的值

2019獨角獸企業重金招聘Python工程師標準>>> 1.獲取連接中的參數,使用倒的關鍵詞PathVariable RestController public class HelloController {RequestMapping(value "/hello/{id}",method RequestMethod.GET)public String index(PathVariable("i…

斷開的管道 java.io.IOException: Broken pipe 解決方法

斷開的管道 java.io.IOException: Broken pipe 解決方法一、Broken pipe產生原因分析1.當訪問某個服務突然服務器掛了&#xff0c;就會產生Broken pipe;2.客戶端讀取超時關閉了連接&#xff0c;這時服務器往客戶端再寫數據就發生了broken pipe異常&#xff01;二、方案1.問題一…

登錄與注冊

代碼如下 private void btn_login_Click(object sender, EventArgs e){SqlConnection sqlconnection new SqlConnection();sqlconnection.ConnectionString ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;SqlCommand sqlcommand new SqlComman…