《輕松學(xué)會(huì)C (第3版)》共18章9個(gè)附錄,在兼顧C(jī) 關(guān)鍵主題的同時(shí),注重編程思維的培養(yǎng)和練習(xí),兼顧邏輯和游戲,以豐富的圖表和其他結(jié)構(gòu)化方式直觀呈現(xiàn)出C 以及C 14的知識點(diǎn)和基礎(chǔ)概念。作者通過深入淺出、通俗易懂的語言,豐富的范例,清楚的解釋,大量的練習(xí),全方位討論了C 的關(guān)鍵主題,從一般的編程概念到技術(shù)到C 的具體特性。通過本書的閱讀,讀者可迅速掌握C 編程精髓。 《輕松學(xué)會(huì)C (第3版)》破除了C 難學(xué)的迷思,適合讀者自學(xué),也是一本適合課堂教學(xué)的入門經(jīng)典。
有邏輯,更有游戲,你會(huì)不會(huì)更想說:C 這樣學(xué),真香!
想要學(xué)習(xí)編程嗎?想要用C 來寫出熱門游戲、商業(yè)應(yīng)用甚至航空航天應(yīng)用軟件嗎?《輕松學(xué)會(huì)C 》將是一個(gè)理想的起點(diǎn)。C 14和免費(fèi)的Microsoft VisualC 社區(qū)版,可以幫助讀者輕松進(jìn)入C 編程世界。
14歲就發(fā)表數(shù)學(xué)論文、畢業(yè)于藤校的作者布萊恩奧弗蘭懂得怎么教大家輕松學(xué)會(huì)C ,從簡短的示例入手,幫助大家理解如何創(chuàng)建使用實(shí)用程序、寫游戲和解謎題。通過簡化知識點(diǎn),耐心講解以及直觀的圖表、示例和練習(xí)并舉,本書可以幫助大家學(xué)會(huì)C ,而且越學(xué)越聰明,越學(xué)越上癮。
本書特色主題:
安裝和使用免費(fèi)的Microsoft Visual C 社區(qū)版
深入講解C 14新標(biāo)準(zhǔn)中有價(jià)值的改進(jìn)特性
以模塊化方式呈現(xiàn)C 14的改進(jìn),幫助讀者更容易寫出兼容性更強(qiáng)的程序
通過更多謎題、游戲和相關(guān)練習(xí)的方式來介紹C 的知識點(diǎn)
講解更多用法,幫助讀者以更高效的方式來使用STL代碼
包含適用于日常編程參考的9個(gè)附錄
譯者序
兩年里利用業(yè)余時(shí)間斷斷續(xù)續(xù)完成了本書翻譯(感謝編輯大人的耐心與寬容)。原因不是本書無趣,而是因?yàn)樘腥ぃg者的時(shí)間又不夠而已。真的是一本C 入門的好書。語言精煉且前后呼應(yīng)。你看到了一個(gè)不太理解的術(shù)語/概念,沒問題,后面肯定有對它的詳盡解釋(而且是用你很容易明白的話)。
原書基于Visual Studio 2015寫作,后來Visual Studio 2017問世,所以譯者在中文版中添加了對Visual Studio 2017的支持。不想用微軟的IDE?沒問題,譯者在這里推薦一些IDE:CodeLite,Dev C ,Eclipse,NetBeans……實(shí)在太多了。具體鏈接可參考譯者的主頁:https://bookzhou.com。
除了最基本的C 編程概念,一些新潮的東西都有所涉及,包括STL模板、C 11和C 14的新功能。至于指針,聽起來很高大上,但讀了本書之后,就會(huì)發(fā)現(xiàn)其實(shí)是小事一樁。關(guān)鍵在于,所有這些內(nèi)容作者都用淺顯的語言講得明明白白。
本書之所以有趣,是因?yàn)槔锩嬷v述了太多實(shí)際問題的解決方案,例如漢諾塔、三門和撲克牌(發(fā)牌、洗牌和判斷一手牌的大小)等。
邏輯和游戲,這是你通過本書來學(xué)習(xí)C 的主要?jiǎng)訖C(jī)之一(就不說就業(yè)必備技能了)。
最后,本書幾乎所有源代碼的注釋和輸出內(nèi)容都有中文。中文版代碼可通過譯者主頁下載(https://bookzhou.com)。
前言
C 可以說是當(dāng)今世界最重要的編程語言。
該語言廣泛運(yùn)用于創(chuàng)建從操作系統(tǒng)到字處理軟件的商業(yè)應(yīng)用。曾有一段時(shí)間大型應(yīng)用程序需用機(jī)器碼來寫,因計(jì)算機(jī)容量太小,其他都裝不了。但今非昔比。比爾·蓋茨(Bill Gates)不得不將整個(gè)BASIC壓縮成64K的時(shí)代一去不復(fù)返了!
作為C語言的繼任者,C 在保留了開發(fā)高效率程序這一目標(biāo)的同時(shí),還最大化提升了程序員的生產(chǎn)力。它生成的可執(zhí)行文件在簡潔性上一般僅次于機(jī)器碼,但能干的事兒要多得多。C 大多數(shù)時(shí)候都是專業(yè)人員的首選語言。
然而,名氣雖大,C 卻不是最容易學(xué)的。這正是寫作本書的目的。
我們是來找樂子的
任何值得學(xué)的都值得付出努力。但不是說這個(gè)過程就不能變得更有趣,本書的目的就是幫助大家輕松有趣地學(xué)會(huì)C 。我從20世紀(jì)80年代開始C編程,從90年代開始C 編程,創(chuàng)建過商業(yè)和系統(tǒng)級的應(yīng)用程序。接觸過各種陷阱,比如未初始化的指針和在if條件中該用兩個(gè)等號(==)的時(shí)候用了一個(gè)(=)。我可以指導(dǎo)你避開多年前我要花上好幾個(gè)小時(shí)來調(diào)試的錯(cuò)誤。
我也喜歡邏輯和游戲。學(xué)習(xí)一門編程語言并不一定意味著枯燥。本書將探索漢諾塔和三門等有趣的問題。
圖表能使學(xué)習(xí)編程的過程更有趣和容易。本書將大量運(yùn)用表格和插圖。
為什么選擇C和C
不是說其他編程語言有什么問題。我是全世界首批寫Visual Basic代碼的人(Microsoft主導(dǎo)的一個(gè)項(xiàng)目),而且我承認(rèn)Python是高級腳本工具。
但只要稍微注意一下,就會(huì)發(fā)現(xiàn)C 學(xué)起來同樣容易。語法比Visual Basic和Python復(fù)雜一些,但C 長久以來都被公認(rèn)為是一種簡潔、靈活和優(yōu)雅的語言。這正是其前身C語言受這么多專家推崇的原因。
C語言一開始的思路就是為重復(fù)寫的代碼行提供快捷方式。例如,可用 n使變量遞增1,而不用寫n = n 1。用C或C 寫的程序越多,就越離不開這些快捷方式,離不開它們的簡潔和靈活。
C 是怎樣思考對象的
計(jì)算機(jī)科學(xué)家丹尼斯·里奇(Dennis Ritchie)創(chuàng)建C來作為寫操作系統(tǒng)的一種工具(1983榮獲圖靈獎(jiǎng))。他需要一種簡潔和靈活的語言,可在必要時(shí)操縱像物理地址這樣的低級東西。結(jié)果是C在其他領(lǐng)域也快速流行。
后來,比雅尼·斯特勞斯特魯普(Bjarne Stroustrup)創(chuàng)建了C ,最開始只是一種有類的C。添加了面向?qū)ο蠊δ,這是我以后要花很多筆墨講述的主題(從第10章起)。面向?qū)ο笫菄@智能數(shù)據(jù)類型構(gòu)建程序的一種方式。本版的一個(gè)主要目標(biāo)就是演示如何將面向?qū)ο笞鳛橐环N高級的、更模塊化的編程方式,以及如何思考對象。
C 最終演化成遠(yuǎn)非僅僅一種有類的C。多年來添加了許多新功能,最引人注目的是標(biāo)準(zhǔn)模板庫(Standard Template Library,STL)。STL不難學(xué),本書將演示如何用它簡化許多編程工作。假以時(shí)日,這個(gè)庫會(huì)成為C 程序員的工作中心。
第3版的目標(biāo)
第3版的目標(biāo)很簡單,就是保持過去版本的優(yōu)勢并修正一些缺陷,尤其是這一版更有趣且更易使用。前兩版的大多數(shù)特色都予以保留,但更著重C 的實(shí)用性(和娛樂性)和面向?qū)ο,不在很少用到的功能上花太多筆墨。例如,我假定你不想寫自己的string類,因?yàn)樗行碌腃 編譯器很早就在提供該功能了。
這一版還強(qiáng)調(diào)了C 社區(qū)的正確語言規(guī)范。這些規(guī)范要么已成為標(biāo)準(zhǔn),要么馬上成為標(biāo)準(zhǔn)。
這一版正式使用Microsoft C 編譯器(社區(qū)版)。也可以用其他順手的C 編譯器,因?yàn)榇蠖鄶?shù)例子都是用標(biāo)準(zhǔn)C 寫成的。不過,第1章會(huì)指導(dǎo)你使用與Visual Studio配套提供的Microsoft編譯器。
本書還包括其他特色。
* 涵蓋C 11和C 14新功能:這一版會(huì)介紹自C 11以來引入的許多新功能,并介紹C 14的一些前沿功能。假定你的C 編譯器至少和Microsoft社區(qū)版一樣新,所以這一版拿掉了一些過時(shí)的編程規(guī)范。
* 更多謎題、游戲、練習(xí)和插圖:這些特色都是第2版大受歡迎的要素。第3版進(jìn)一步發(fā)揚(yáng)光大。
* 更著眼于面向?qū)ο蟮臑槭裁春驮趺醋觯篊 的類和對象功能一直都被寄予厚望。本版在修訂時(shí)的一個(gè)主要目標(biāo)就是強(qiáng)調(diào)類和對象的實(shí)用性以及如何思考對象。
* 更多STL的知識:標(biāo)準(zhǔn)模板庫不難學(xué),能簡化編程并提高效率。這一版會(huì)更多地探索STL。
* 有用的參考:這一版在書末保留并擴(kuò)展了快速參考附錄。
怎么開始
這一版假定你對編程一無所知或只知道一點(diǎn)。會(huì)開電腦,會(huì)用菜單系統(tǒng)、鍵盤和鼠標(biāo)就行。第1章將指導(dǎo)你安裝和使用Microsoft C 社區(qū)版。注意,該版本的C 在Microsoft Windows上運(yùn)行。使用其他系統(tǒng)(比如Mac OS)需下載不同的工具。但C 常規(guī)的東西是共通的,本書大多數(shù)內(nèi)容可以直接使用。
更多圖標(biāo)
前兩版引入了許多有用的圖標(biāo),這一版更多,作用是幫你快速定位自己需要的內(nèi)容。請?zhí)貏e留意這些符號,它們強(qiáng)調(diào)了需要特別關(guān)注的部分。
剖析示例程序,逐行解釋工作原理。不需要自己讀長長的代碼,我?guī)湍阕隽耍?或者說,我們一起研究。)
在每個(gè)完整的示例程序后面,都提供了至少一個(gè)練習(xí)(通常幾個(gè))。它們圍繞例子展開,鼓勵(lì)你修改并擴(kuò)展剛才看到的程序代碼。這是最好的學(xué)習(xí)方式。練習(xí)答案在作者的網(wǎng)站(brianoverland.com)提供。
圍繞一個(gè)例子展開,分析如何改進(jìn)、變得更短或更高效。
修改例子做其他事情。
提示新的語言關(guān)鍵字,清楚解釋其用法。
和關(guān)鍵字相似,但提示的是不涉及關(guān)鍵字的C 語法。
偽代碼是用自然語言描述的程序或程序片斷。作用是幫你弄明白程序需要做的事情。然后將其直接轉(zhuǎn)換成C 語句即可。
本書還穿插了一些有意思的花絮。不是特別關(guān)鍵,供閑暇時(shí)閱讀。
列出重要事項(xiàng),要么是需要注意的特殊事項(xiàng),要么是一些陷阱,例如版本問題和需要最新編譯器的一些語言功能。
表明當(dāng)前主題只適合最新的C 14語言規(guī)范。
不涉及哪些主題
生命中沒什么是免費(fèi)的,除了愛、落日、空氣和小狗。(實(shí)際上小狗都可能不是免費(fèi)的。前不久我看了一些大丹犬,每只都要大概3000美元。但真的很可愛。)
由于需要強(qiáng)調(diào)對于初級到中級程序員來說重要的主題,所以這一版稍微減少了對于一些不常用功能的討論。例如,操作符重載(前期一般都不會(huì)在類中編碼這一功能)被移到了最后一章。其他大多數(shù)主題(包括相對高級的主題,比如位操作)都只是稍微提了一下。重點(diǎn)還是基礎(chǔ)。
C 或許是目前規(guī)模最大的編程語言,就像英語擁有自然語言中最大的詞庫一樣。一本面面俱到的入門書,這個(gè)出發(fā)點(diǎn)本身就是錯(cuò)的。但是,如果想學(xué)習(xí)C 的高級主題,也有大量資源可以參考。
有兩本書我特別推薦。一本是C 語言創(chuàng)始人比雅尼·斯特勞斯特魯普(Bjarne Stroustrup)的《C 編程語言》第4版,這是一本權(quán)威、全面和詳盡的大部頭參考書,建議在C 上手之后學(xué)習(xí)。如一本易于使用的參考書,推薦我自己寫的C for the Impatient,它覆蓋了語言和標(biāo)準(zhǔn)模板庫的幾乎一切內(nèi)容。
圖形用戶界面(GUI)編程對平臺(tái)依賴較大,要選擇專門的書來學(xué)習(xí)。本書介紹核心C 語言及其庫和模板,這些是獨(dú)立于平臺(tái)的。
再次提醒:找樂子
C 沒什么好怕的。偶有陷阱,但我會(huì)引領(lǐng)你繞開。在你不小心或者不知道自己在做什么的時(shí)候,C 有時(shí)會(huì)顯得稍難。但通過不停思考這些問題,情況會(huì)變得越來越好。
C 并不抽象。希望你通過實(shí)例來解謎和游戲,并從中獲得樂趣。雖然本書目的是教會(huì)你一門新知識,但也希望寓教于樂。
源代碼、練習(xí)答案和勘誤
從作者或譯者主頁下載本書源代碼、練習(xí)答案和勘誤。作者主頁是http://brianoverland.com/books/或https://github.com/transbot/CPP-without-fear。譯者主頁是https://bookzhou.com。
致謝
這一版是編輯金姆(Kim Boedigheimer)和我在西雅圖派克市場附近喝茶的時(shí)候確定下來的。這本書更像是她的孩子而不是我的。她帶來了一個(gè)出色的編輯和生產(chǎn)團(tuán)隊(duì),極大簡化了我的工作。團(tuán)隊(duì)成員包括科瑟爾(Kesel Wilson)、黛博拉(Deborah Thompson)、克里斯(Chris Zahn)、蘇珊(Susan Brown Zahn)和約翰(John Fuller)。
特別感謝萊奧爾(Leor Zolman)出色的技術(shù)審校。感謝微軟前軟件開發(fā)工程師約翰(John R. Bennett)提供許多有益的反饋。還要感謝網(wǎng)絡(luò)作家大衛(wèi)(David Jack)提供一些有用的插圖。
作者簡介
布萊恩奧弗蘭(Brian Overland)
大型商業(yè)項(xiàng)目的專業(yè)開發(fā)人員,有豐富的寫作經(jīng)驗(yàn)和編程教學(xué)經(jīng)驗(yàn)。在微軟工作期間,從事過開發(fā)、文檔和項(xiàng)目管理經(jīng)驗(yàn),獲得過多項(xiàng)寫作大獎(jiǎng)。高科技公司的連續(xù)創(chuàng)業(yè)者,斜杠青年,不是在編程和寫技術(shù)類書,就是在玩喜劇表演和寫小說。
譯者簡介
周靖
硬件與軟件專家,微軟MVP,知名譯者,涉獵廣泛,具有深厚的技術(shù)功底和良好的文學(xué)素養(yǎng)。早期癡迷于硬件,《微型計(jì)算機(jī)》雜志特約作者。繼而潛心鉆研C /C#程序設(shè)計(jì),并在這方面積累了豐富經(jīng)驗(yàn)。此后從事相關(guān)技術(shù)圖書的翻譯。其翻譯風(fēng)格嚴(yán)謹(jǐn)、準(zhǔn)確、流暢,深受讀者好評。代表譯著有《C 入門經(jīng)典》系列版本、《Windows核心編程(第5版)》、《CLR via C#(第4版)》、《深入理解C#(第2版)》、《Visual C#從入門到精通》系列版本和《C#本質(zhì)論》。
目錄
第1章 開始使用C 1
1.1 安裝Microsoft Visual Studio
2015/2017 1
1.2 用Microsoft Visual Studio創(chuàng)建
項(xiàng)目 3
1.3 用Microsoft Visual Studio寫程序 4
1.4 用Visual Studio運(yùn)行程序 5
1.5 兼容性問題#1:stdafx.h或pch.h 5
1.6 兼容性問題#2:暫停屏幕 6
1.7 如果不用Visual Studio 7
1.8 跳到下個(gè)打印行 10
1.9 存儲(chǔ)數(shù)據(jù):C 變量 13
1.10 數(shù)據(jù)類型簡介 14
1.11 變量名和關(guān)鍵字的注意事項(xiàng) 21
小結(jié) 22
第2章 判斷語句 25
2.1 準(zhǔn)備功課:數(shù)據(jù)類型 25
2.2 在程序中判斷 26
2.3 循環(huán)入門 33
2.4 C 的真和假 39
2.5 遞增操作符( ) 39
2.6 語句和表達(dá)式 41
2.7 布爾(短路)邏輯入門 42
2.8 Math庫入門 45
小結(jié) 51
第3章 判斷語句進(jìn)階 53
3.1 do-while循環(huán) 53
3.2 隨機(jī)數(shù)入門 56
3.3 switch-case語句 63
小結(jié) 67
第4章 全能又好用的for語句 69
4.1 計(jì)數(shù)循環(huán) 69
4.2 for循環(huán)入門 70
4.3 大量例子 71
4.4 局部循環(huán)變量 75
4.5 語言對比:Basic語言的
For語句 78
小結(jié) 79
第5章 被大量調(diào)用的函數(shù) 81
5.1 函數(shù)的概念 81
5.2 函數(shù)的使用 82
5.3 局部和全局變量 90
5.4 遞歸函數(shù) 92
5.5 繼續(xù)游戲 107
小結(jié) 108
第6章 數(shù)組 111
6.1 C 數(shù)組初探 111
6.2 初始化數(shù)組 112
6.3 基于零的索引 113
6.4 字節(jié)串和字符串?dāng)?shù)組 121
6.5 二維數(shù)組:進(jìn)入矩陣 127
小結(jié) 128
第7章 指針 131
7.1 指針到底是什么? 131
7.2 指針概念 132
7.3 聲明和使用指針 133
7.4 函數(shù)中的數(shù)據(jù)流 140
7.5 交換:另一個(gè)使用指針的函數(shù) 141
7.6 引用參數(shù)(&) 147
7.7 指針運(yùn)算 147
7.8 指針和數(shù)組處理 149
小結(jié) 153
第8章 字符串:分析文本 155
8.1 計(jì)算機(jī)如何存儲(chǔ)文本 155
8.2 單字符和字符串 169
8.3 C 語言的string類 172
小結(jié) 179
第9章 文件:電子存儲(chǔ) 183
9.1 文件流對象入門 183
9.2 對比文本文件和二進(jìn)制文件 191
9.3 二進(jìn)制運(yùn)算基礎(chǔ) 193
小結(jié) 200
第10章 類和對象 203
10.1 理解OOP 203
10.2 對象的含義 204
10.3 Point:一個(gè)簡單的類 206
10.4 Fraction類基礎(chǔ) 212
小結(jié) 229
第11章 構(gòu)造函數(shù) 231
11.1 構(gòu)造函數(shù)入門 231
11.2 引用變量和引用參數(shù)(&) 242
11.3 拷貝構(gòu)造函數(shù) 243
11.4 將字符串轉(zhuǎn)換為分?jǐn)?shù)的構(gòu)造
函數(shù) 245
小結(jié) 247
第12章 兩個(gè)完整的OOP例子 249
12.1 動(dòng)態(tài)對象創(chuàng)建 249
12.2 new和delete的其他用法 250
12.3 二叉樹應(yīng)用 251
12.4 漢諾塔問題:動(dòng)畫版 260
小結(jié) 267
第13章 用STL簡化編程 269
13.1 列表模板 269
13.2 設(shè)計(jì)RPN計(jì)算器 277
13.3 正確解釋尖括號 286
小結(jié) 287
第14章 面向?qū)ο蟮娜T問題 289
14.1 邏輯推理 289
14.2 電視節(jié)目(面向?qū)ο蟀? 291
小結(jié) 307
第15章 面向?qū)ο蟮膿淇伺朴螒?309
15.1 贏在拉斯維加斯 309
15.2 怎樣抽牌 310
15.3 vector模板 319
15.4 判斷牌型 325
小結(jié) 333
第16章 多態(tài)版撲克牌游戲 335
16.1 多種牌墩 335
16.2 純虛和其他抽象事項(xiàng) 345
16.3 抽象類和接口 346
16.4 面向?qū)ο蠛虸/O 347
小結(jié) 354
第17章 C 14新功能 357
17.1 C 14最新功能 357
17.2 C 11引入的功能 362
小結(jié) 381
第18章 操作符函數(shù):用類來完成 385
18.1 操作符函數(shù)入門 385
18.2 作為全局函數(shù)的操作符函數(shù) 387
18.3 通過引用提高效率 389
18.4 操作其他類型 399
18.5 類賦值函數(shù)(=) 399
18.6 相等性測試函數(shù)(==) 401
18.7 類的打印函數(shù) 402
18.8 結(jié)語(關(guān)于操作符) 406
小結(jié) 407
附錄A 操作符 411
附錄B 數(shù)據(jù)類型 419
附錄C 語法總結(jié) 425
附錄D 預(yù)處理指令 437
附錄E ASCII代碼 443
附錄F 標(biāo)準(zhǔn)庫函數(shù) 447
附錄G I/O流對象和類 455
附錄H STL類和對象 461
附錄I 術(shù)語表 469