直接看 ISO C++14 的標準文檔學習 C++ 可行嗎?
1. 有一定的編譯原理基礎和可計算理論基礎(包括形式語言、自動機等)。
2. 語言方面有 C 語言和一些 Python 的基礎。3. 另外還 看過 Computer Organization and Design (MIPS 版)。
以學習 C++ 為目的看的話,性價比不高。以解決疑問為目的看的話,是不二之選。
表示Python document裡面的language reference還帶一部分tutorial的內容,雖然有獨立的tutorial部分,但是整體來說要比ISO C++14簡單好幾個數量級。不過不知道題主現在看的怎麼樣了。
看過一點ISO C++標準(其實是草案,不過基本接近),簡單說下我的感觸。
首先,要強調的是『標準是最準確和嚴密的』,基本上所有的C++問題在標準中都可以找到直接或間接的答案。所以看標準是有用的,這點應該大家都沒什麼異議。
不過題主的問題是『是否可行』,我的答案是取決於你的目的。
1. 如果你只是想要學習如何用C++編程,那麼我的建議是:不要看。任何語言學習初始狀態都是模仿,這個時候你需要一個有完整思路的教程。標準並不是教程,它是將語言拆開平攤在你的面前,一個細節一個細節的講,這其中包含的邊界情況太多,絕大多數你在一開始使用C++編程的時候並不會遇到。看標準入門雖然可能很酷,但事實上並不是一個好方法。
2. 如果你想弄清楚C++語言的一些核心概念到底是怎麼回事,那麼我的建議是:請看標準。舉個例子,C++裡面一個比較晦澀的概念『左值與右值』,標準的解釋非常直接和到位,這裡貼個截圖大家看個意思,並不完整,完整可參見[basic.lval]一節。
3. 題主特意提到掌握一些編譯原理相關知識,那麼我大膽猜測你的一個可能的目的是了解C++語言設計本身,那麼我的建議是:推薦看標準,這是最有效的方法之一,畢竟這裡面有些東西如果你不關心 template meta programming, 可能一輩子也不需要關心。另外,如果你願意對著LLVM代碼查看,會有個呼應,易懂一些。
還是舉個例子。C++裡面一個蛋疼的概念是POD, 全稱Plain Old Data,這東西在直覺上特別簡單,但是細節上又比較瑣碎。
在LLVM有一個函數用來判斷一個Type是不是POD的,節選下代碼。
可以看到注釋中很清晰的寫出了對應於標準的哪一個條款。然後我們再對著標準看一下。基本可以對應起來。(POD struct 引出的 trivial class 和 standard-layout class 兩個概念,你也可以通過代碼跳轉找到它們的具體章節和意思)
4. 雖然題主沒問,不過看標準完全可以當做一種娛樂方式,在其中發現一些有意思的東西(&雖然完!全!沒!啥!用!&)。
- 按照範式,字面量0是八進位數,而不是十進位數,好吧,這其實是個冷笑話。
- "foo"會匹配bar(char*)的參數,雖然「foo」是個const string。
- int i = 9999999; short s =i; 這段代碼在默認編譯參數下,不會有警告。
- short s = 1; short ss = 1; typeid(s + ss) 是什麼呢?答案是 int。
- 重載 ab 會喪失短路效果,原因是變成了函數調用。
- NULL並不是C++標準。
- 按照標準,參數的計算順序是無序的。
- ...
大概就是這樣。
註:[1] 標準的截圖均取自 n3690:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf,這個是C++11那會兒的標準草案了。[2] 最後的幾點羅列取自我多年之前的筆記,如有錯誤,請指正,多謝。我不想看案例直接看法律條文能當上律師嗎
我用一根手指學編程行嗎怎麼不行,我覺得行,斧子誰不愛,斧即真理
那麼您選擇此種學習方法的動機呢?
閱讀標準文檔固然是一種可嘉的行為,但如果您是以開發為目的的話,仍然需要一些來自工程實踐方面的指導,而世面上的C++入門以及進階讀物則可以很好地補充這一點。就我個人的經驗而言,在這一點上進行投入,是值得的。以下是我的推薦:
入門書籍
C++ Primer 5thThe C++ Programming Language 4th二選一即可然後,還請留意一下Scott Meyer和Herb Sutter的有關書籍。第一次在知乎上正式回答問題, 我熟悉這個話題, 但是還遠沒有到掌握,精通的程度。
11年左右的時候就準備讀一讀標準, 但是項目原因擱淺了;兩年前開始重新讀C++11 ISO 文檔。
//------------------------------------------------------------------
干讀,沒有輔助文檔與代碼。
概念晦澀難懂, 上下文指代關係盤根錯節, 無法與實際代碼建立起來任何聯繫。
很難從整體上把相關關係整理清楚;也很難提綱挈領建立樹狀知識結構;逐漸感覺到與建立C++語言全方位模型的初衷很難契合。
舉個例子吧。在理解ODR時,著實費了一番勁(感覺每個單詞都認識,就是不知道他們在說什麼? 表現在代碼上是什麼意思)。
由於項目需要,閱讀《C++ Template》時偶然間發現那上面有一節稍微通俗點的解釋。豁然開朗。然後就開始找各種C++的書籍作為輔助讀物。比如《C++編程語言》,也是非常適合作為其輔助讀物的,雖然不是一一對應的關係。
之前研究過幾天QT的部分代碼,覺得非常值得研究;還有STL的代碼。
前幾天,看到關於Scott的採訪,說他非常想不用工作掙錢來養家糊口(大意),裡面還提到他研究編譯器代碼的。這幾天國慶節,沒有來得及找相關的編譯器來研究,今天就看到LLVM的代碼了。
//----------------------------------------------------------------------
兩年下來,覺得對C++的認識加深了,可以跨知識點來理解,解決問題了。
看標準只是一個途徑,輔以相關書籍,代碼,編譯器,高屋建瓴地建立C++語言模型,然後應用到項目加深理解。
也不要一天到晚的讀文檔的方式學習。工作,文檔,sample, 看點其它的書籍(我在這個過程閱讀了《計算的本質》, 《Ruby基礎》,《Ruby元編程》,《SICP》,《R6RS》,以及Scheme相關的一些其它書籍。)也是非常有助於理解的。
//------------------------------------------------------------------------------
我讀書在不斷地嘗試問為什麼來加深理解,因為知識間的聯繫越多,理解就越深,當然也就越不容易忘記。
比如這裡有一段:
x,怎麼能MOVE呢? 它是一個左值啊!下面有一個例子:
A GetA()
{
A a;
a.xxxx()
....
return a; //a,是一個左值(因為它有名字),是一個expiring value(它將要接近它生命周期的終結點)。 expiring value 不需要顯式的move(),編譯器會自己做出合適的決定。
}
感覺是0基礎直接背詞典學英語的節奏
堅持不下去的,至少我不行。很無聊,沒有成就感,還容易忘。你看過,也只是看過,不提有些地方太抽象你不實際操作根本不可能懂,就說你看了大半了,到實際要用的時候你知道用哪個怎麼用嗎?
快一個月過去了,想知道題主看標準學得怎麼樣了。
我發現生活中很多道理淺顯易懂,大家都明白,用到學編程這裡很多人就成了糊塗蛋。
你如果直接想問題想不明白的話,建議你可以類比,雖然不總是能套對了,但總比南轅北轍要好。標準文檔好貴。。
就跟歐幾里得幾何一樣,僅憑几條簡單的公理推出了龐大的數學大廈,學習c++的過程就是熟悉各種經驗的過程,很多操作不是知道規則就能想到的
推薦閱讀:
※為什麼很少有用lisp描述演算法?
※c和c++這類沒有gc的語言是不是騙自己?
※如果沒有PGO,JIT 編譯相比AOT 編譯有哪些優勢?
※如何從粗通一門編程語言到精通一門?
※哪一種計算機語言最適合入門?是C語言嗎?可是我覺得指針難死了!?