無編程基礎,跳過C直接學C++,壞處是學習難度陡峭,還是會有知識缺陷,還是二者都有?
挑的第一本自學教材是《C++大學教程》(第九版),作者:Paul Deitel,Harvey Deitel
如果只是以入門的程度,完成一些簡單的編程習題,兩者分別不大。我認為從哪一個入門也可以。
C++ 標準庫還提供一些容器、演算法等實現,使用上很方便。如果需要學習數據結構和演算法,最好還是自己實現一遍(C 的話可能逼著必須自行實現)。
但要選擇學習 C 或 C++ 整個語言/標準庫的話,那麼兩者的分別是巨大的,C++ 要複雜得多。C 語言和它的標準庫相對簡單,但要實現一些功能可能需要更多代碼,以及更多人為約定。所以「難度陡峭」是很難比較的,主要和要做什麼事情相關,而不是語言。
如果從完整學習一個語言來說,完整地學習 C++ 意味著也會懂得 C(C 幾乎是 C++ 的子集),相反則不然。題主覺得學 C 而不懂 C++ 是「有知識缺陷」的話,也可以說得通。但這是建基於「完整地學習C++」的,對於初學者而言,通常也只會學習少部分,無論如何也會有很多「知識缺陷」。
從實用角度看的話,如果最終是希望做需要 C/C++ 的工作,那麼 C++ 還是必須的。
C 與 C++ 的真正區別在哪裡? - Milo Yip 的回答如果你的目標是使用C++,那學習C也是很浪費時間的,C有很多知識到了C++裡面就變成了陋習,學了不僅沒有用,反而會影響你對C++的使用。等你學會了C++,反過來在看C的陋習的部分,事半功倍。
這個問題等價於:
無中文基礎,跳過甲骨文直接學現代漢語,壞處是學習難度陡峭,還是會有知識缺陷,還是二者都有?學習難度顯然不會陡峭,知識也不會有缺陷。
再說,這年頭,你要看純C的項目代碼,10個有9個是類C++的。弄個結構體,裡面一堆函數指針,模擬類。弄個宏,上千行,模擬template。到底哪個更陡峭。可以直接學C++,陡峭不陡峭與其它的基礎知識有關,與你學來用的目的也有關。知識缺陷肯定有,但並不是學個C就沒缺陷了。
主要的知識缺陷在於底層的計算機體系結構,理論層的演算法與數據結構,語言層面的編譯原理。你當然可以繞過C去學這些東西。輪子哥說的對,尼瑪現在有些人寫的代碼就全是c風格,寧願寫三千行全局硬直代碼在一個文件裡面也捨不得分幾個類包裝下。
這種人設計的資料庫也是很硬直的,比如一個表存放了所有東西,要用的時候再去解析,分割。醉的很。
C++本來就可以直接學,沒必要先學C——事實上跟其他答案不同,在我看來先學C是有害而無益的。
純C會破壞初學者的抽象思維能力,因為C只適合面向過程編程這一種範式,如果在初學階段不去接觸多個編程範式(至少要接觸OOP)的話,初學者的思維很容易就固化在這一種編程範式了,這會讓初學者養成很糟糕的習慣,無法真正熟悉和正確使用面向對象編程思想。
在實際應用中,純粹的面向過程式編程,應用範圍幾乎沒有——因為這意味著你不能實現和使用任何自己定義的數據結構——目前幾乎所有主流教材和工程實踐中的,基於C語言的數據結構實現,本質上都是「強行OOP」,直接結果就是C語言的簡陋貧乏,缺乏現代語言特性的缺點就被暴露無遺了。
至於「貼近底層」的特點,C++也一樣完全擁有——事實上C語言幾乎所有的優點,C++都有,就好像你找不出什麼功能是iPhone6獨佔,而iPhone6S沒有的一樣……編程是一種思維,和語言無關,但是語言卻會限制你的思維方式
看到這個問題,使我不禁擔憂起來:我不用iPhone 7的話,也許我也不會用iPhone 7 Plus。。。
理論上C++是可以直接去學最新標準的
但是沒有從0教你C++的書,大部分的C++書,包括C++ Primer,都需要閱讀者有其他語言基礎以個人親身經歷為基礎,完全不贊成以C為基礎去學C++。C和C++完全沒有什麼必然的聯繫,先學C會把C中的很多習慣帶入C++中,我在學C之後去學C++,導致很長一段時間寫C++寫得更像C,不用面向對象等等問題吧,結果就是代碼既不像C也不像C++。
零基礎學C++,學習難度還是有些陡峭的,這個還是要根據個人情況,如果覺得C++難,個人建議可以先學java作為編程入門語言。
你要明確學C語言的目的。
如果你是要寫程序,C語言用起來太費勁,做大一點的東西肯定不會用C。學了之後你除了考試基本不會用到。事倍功半。
如果你是要學習計算機的基礎知識,我也不推薦C,或者C艹,因為上手比較慢,你的學習重心會偏向語言而不是要學習的知識上。夠折騰。所以學Python之類的更方便一些。也能做工程。人家都開始做東西了,你還在學語法,這是很難受的事情。
我覺得學C的正確目的應該是:了解C語言的語法以及具備閱讀一定長度的C代碼的能力,方便你以後碰到碰到C代碼時,能夠讀懂。有些書喜歡用C代碼來當範例。
按照這個目的來,你只要快速掌握C的語法,做幾個類似於計算器啊,詞典啊,或者做個簡單的解釋器這種東西,一般就夠了。如果能準備好資料,一天有個五小時學習時間,也就一個月不到的事情。
你要做網站做APP,用C或者C艹就太費勁了,也就在所謂的性能優化中寫一點。作為一個軟體工程師,你應該學會找到合理的工具去做合理的事情,而不是拿狂戰斧來做筷子,或者拿水果刀砍樹,太折騰自己了。
當然學生有的是時間折騰,所以你掌握了知識後也可以去學一下C艹。入門還是別玩自己的好,學C痛苦比C艹短。學Python更短。
至於所謂的代碼風格這類的東西,這和語言關係不大,和人關係比較大。代碼風格這種事,你需要另外學習。無編程基礎的人,還是應該從培養興趣入手。嗯,首先需要熟悉鍵盤滑鼠的用法,打打遊戲先。
是的,學c++必須學c
但是這就夠了么?1960年出現了一種面向問題的高級語言ALGOL 60 。 1963年英國劍橋大學推出了CPL(Combined Programming Language)語言,後來經簡化為BCPL語言。 1970年美國貝爾(Bell)實驗室的K.Thompson以BCPL語言為基礎,設計了一種類似於BCPL的語言,取其第一字母B,稱為B語言。 1972年美國貝爾實驗室的Dennis M.Ritchie為克服B語言的諸多不足,在B語言的基礎上重新設計了一種語言,取其第二字母C,故稱為C語言。ALGOL 60不精通,你的基礎怎麼牢固?你的技術體系怎麼健全?
你以為這就夠了么?
還有彙編呢
你以為彙編精通就夠了么?你會打紙帶么?是的!打紙帶才是一個起點!精通打紙帶技術,是每個程序員必備的,要不然你永遠只是一個碼農罷了!既然是編程學習,為什麼不學php呢?
題主是大學生吧,某也斗膽答一個大二渣的角度:
不會。先C++後C吧,當初不學C也是聽了輪子哥的。只看過c++ primer。可以直接上,不虛,不躁,不懶。不一會兒你就會發現年長一點的老師的Cpp帶著濃郁的c口音,不用vector還有用array?不用shared_ptr還在苦逼地數著new?但是只是圖各種庫的方便,為何不直接C#之流?因為C/C++的在教學界存在是有一定道理的。但如果題主讀的恰好好是計算機,建議有空回去小補一刀C,晚輩不知天高地厚地說一句:C是很好的串聯起整個計算機科學的基本知識的基本骨架(只是看到了CSAPP選擇了C)。雖然以後可能並不會用到,而且對GPA也無助的樣子,但某些知識學來就是拿來浪費的,所謂「化作春泥更護花」。我幻想著,以後在面試官面前,本來扯著C的耳朵的我,一不小心扯出了一整個計算機系統和那些project們,然後……
我就沒學過c,當年學完Pascal,直接上c++,之前還自學了vb。
學了c再學c++反倒可能有問題
現在很多人老是把c以為是c++的基礎,c++是c的進階,c#是c++的進階。。c 跟 c++ 根本就不是相同的語言好嗎!?誰再說差不多的,根本就沒學過
沒有基礎好啊直接學 Lisp 再回頭看什麼 C/C++ 跟玩一樣(逃
建議題主直接去學Go
推薦閱讀:
※關於《深度探索C++對象模型》有一段話看不懂?
※輪子哥可以分享一下曾經是怎樣帶學生的嗎?
※cout 和 cin 的底層實現是怎樣的?
※C++中if(a!=b)和if(a^b)哪個效率更高?
※如何設計一個真正高性能的spin_lock?