0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從C++的“深度”與“廣度”來探究其復(fù)雜程度

C語言專家集中營 ? 2018-01-15 15:48 ? 次閱讀

從深度和廣度談C++的復(fù)雜度

C++到底有多復(fù)雜,沒有人知道,我們知道的,只是C++很復(fù)雜。但是再復(fù)雜的事情也有解決的方法,對于C++的復(fù)雜度,我們可以從C++的“深度”與“廣度”來探究。

C++有一個樸素的思想:“簡單的問題用簡單的方法解決,復(fù)雜的問題,用復(fù)雜的方法解決?!?。這句話當(dāng)然不能絕對化。一個問題的復(fù)雜性,往往有多種來源,比如可以是“深度”上的困難;從這一點上,我們了解,證明“任何一個>=6之偶數(shù),都可以表示成兩個奇質(zhì)數(shù)之和 ”是個難題,雖然題目很短一讀明白,但它確實是一個復(fù)雜的問題,因為它是“哥德巴赫猜想”。

復(fù)雜度的來源也可以是問題的“廣度”。比如給一個人做一道可口的菜是簡單的,但今天是周末,我家來了七大姑八大姨,站在廚房里的我就會感覺面臨一道復(fù)雜的問題。我不僅要了解每一位親人的口味,并不絕不能做八道菜,讓客人各選所需就算了。八個簡單的問題,交叉在一起時,成就了一道“眾口難調(diào)”的復(fù)雜的問題。

C++中所具備的復(fù)雜功能,一小部分有助于我們解決深度上的復(fù)雜問題,但更多的功能,是為用來對付“廣度”上問題。這符合軟件開發(fā)行業(yè)的主要市場需求。

小結(jié)一下:C++中有很多復(fù)雜的(方法或)知識點其實是留著對付一些復(fù)雜問題的。但,我們在學(xué)習(xí)C++時,我們能遇上什么“復(fù)雜”問題嗎?答:很少,甚至就是沒有。那么,光靠一些簡單的問題,我們能理解那些復(fù)雜的方法嗎?

比如“面向?qū)ο蟆?。C++之父早說過,C++語言不是,也不愿意成為一門單純的“面向?qū)ο蟆钡恼Z言。為什么?因為“簡單的事情簡單解決?!?,“面向?qū)ο蟆钡?a href="http://www.ttokpm.com/v/tag/1315/" target="_blank">編程思想,在歷史上出現(xiàn),就是為了解決足夠龐大的復(fù)雜問題才提出,并且確實取得了一定程度上的成功。于是乎人人都對它趨之若騖,更是成為了大學(xué)編程專業(yè)的必修課。但請問,你根本就沒可能在書本上遇上任何足以體現(xiàn)“面向?qū)ο蟆敝匾缘膯栴},你怎么學(xué)習(xí)“面向?qū)ο蟆蹦?請注意,寫一個“非常面向?qū)ο蟆钡某绦?,是很容易地,一個java版本的“Hello world”程序就很OO。但把程序?qū)懙梅浅S小懊嫦驅(qū)ο蟆钡娘L(fēng)格,這絕對不是我們的目標(biāo)。目標(biāo)是解決問題,“面向?qū)ο蟆笔且环N“思想工具”,當(dāng)我們判斷再沒有更簡單的工具來解決一個問題時,于是把手伸入機(jī)器貓的口袋,叮叮鐺……屏幕上打出四個大字“面向?qū)ο蟆薄?/p>

有同學(xué)要舉手反對了,復(fù)雜度是相對啊。一個在大拿眼里,很簡單的,用面向過程可以非常漂亮地解決的問題,但在初學(xué)者面前,就是一個大廣度的問題,這時,作為一種組織方法,“面向?qū)ο蟆辈荒軒臀覀冃┦裁磫?如果能幫上,那我們用它來學(xué)習(xí)“面向?qū)ο蟆?,就不算是紙上談兵了?

完全同意。像Linus這樣的大牛,操作系統(tǒng)這樣既深又廣的問題,他都覺得用C語言這樣典型的面向過程的語言,就可以輕易拿下,他倒覺得像C++這樣的語言的OO,純是添亂。

復(fù)雜度當(dāng)然是相對的,但當(dāng)我們面臨,或者說期望的復(fù)雜是指“廣度”上的復(fù)雜度時,普通教程上的那種一桿子想把C++語言捅到底的教學(xué)內(nèi)容與教學(xué)方式,就顯得非常的不夠用了。寫一個“俄羅斯方塊”的程序,就是一個“相對復(fù)雜”的問題。翻開一本《C++ Primer》,740多頁,如果僅僅從C++語言知識點來看,任何一個學(xué)到第227頁的讀者,都應(yīng)該要開始動手寫一個俄羅斯方塊的程序。因為那時候他已經(jīng)懂得多維數(shù)組,于是可以定義出方塊數(shù)據(jù);他已經(jīng)懂得if判斷,于是寫得出碰撞判斷;他已經(jīng)學(xué)會for循環(huán),于是知道如何消掉被填滿的一行或多行……

有人覺得我這是“忽悠”。他們又改口說,“俄羅斯方塊”是一個太復(fù)雜的問題了,如果學(xué)生在學(xué)習(xí)半途花上一個月時間去搞一個俄羅斯方塊,會節(jié)外生枝,徹底打亂原來學(xué)習(xí)計劃云云。好吧我承認(rèn)確實存在苦研十年軍事理論,然后殺上戰(zhàn)場一舉成名的將軍;但我更愿意相信多數(shù)將軍是不斷地打一場場小戰(zhàn)役,不斷地在晚上挑燈看《武穆遺書》的過程中成長起來的。而我也確實看到那些在一個月中,被“俄羅斯方塊”程序搞得頭破血流,并堅持下來的學(xué)生,確實在日后遇上問題時,有著更好的“糾纏”能力。試想一下吧,學(xué)完《C++ Primer》200多頁時,像樣的問題都沒遇上一個,卻要再翻過那么一百多頁,然后開始學(xué)習(xí)“第三部分 類和數(shù)據(jù)抽象”。

我用《C++ Primer》當(dāng)教材當(dāng)老師,不是一次兩次了,但每當(dāng)我開始兜售“面向?qū)ο蟮谋举|(zhì)不是封裝、不是派生、不是多態(tài),而是抽象”時,我總覺得自己是那么無力。底下的戰(zhàn)士,他們沒有打過任何一場像樣的戰(zhàn)役,但他們希望在課堂上成長為巴頓,成長為陳庚。

在那一時,我總會想起C++之父痛心地說到C++教育的一句話,大意是說:現(xiàn)在C++教育似乎進(jìn)入了一個怪圈:要教會一個人C++,唯一的辦法,就是把他教成C++高手。我在從事C++教育時,很長時間,發(fā)現(xiàn)自己一樣落在怪圈里!長嘆。

(以上內(nèi)容,任何有正常理智或心態(tài)的人,都不會認(rèn)為:本文作者在說《C++ Primer》是一本差書。)

對一個初學(xué)者,學(xué)完《C++ Primer》227頁之后,動手寫一個俄羅斯方塊游戲,復(fù)雜在哪里?

(一),C++初學(xué)者(沒有其它語言學(xué)習(xí)經(jīng)驗)那時剛剛把類型、變量、數(shù)組、指針、if、for………裝入腦里,每一個知識點都才剛剛開始消化,這時要把這一切摻合到一起,去解決一個真正的問題,就像一個剛剛看完《高爾夫球桿使用說明》的人上了場,那個亂勁兒!

(二),沒有人會覺得寫一個字符界面的俄羅斯方塊很爽,所以總得要去碰一下圖形用戶界面的編程知識吧。窗口、菜單、定時器、消息、GDI,資源文件……媽啊。就這一點就夠廣的。

(三)、教材里那些花花草草小貓小草的例程,也確實拿來過調(diào)試,什么單步跟蹤、什么斷點、什么變量觀察……還有什么條件編譯、二分法、以及如何使用Windows的調(diào)試API,比如“OutputDebugString”函數(shù)等等,平常老師在臺上講,我們都覺得需要那么多調(diào)試方法嗎?現(xiàn)在可好,程序好不容易編譯通過,一運行就死了,一頭霧地才開始想如何調(diào)試……

公元一九八九年,有人問總設(shè)計師說中國十年改革開放最大的失誤是什么?他說是教育。(公元2008?)有人問C++之父,十?dāng)?shù)年,C++語言最大的失誤是什么?Stroustrup說,也是教育。這個“也”字純屬我加的。原文得是這樣:

Stroustrup Says C++ Education Needs To Improve :

“在C++的早期,我很擔(dān)心不能足夠快的教好教師。我有理由擔(dān)心,因為許許多多明顯的C++的錯誤使用都可以追蹤到教育者自身對基礎(chǔ)的誤解。我未能足夠清晰的闡述我的想法和原理?!盨troustrup表示,“我避免傳授‘如何思考’,我猜想最好的教育之法是使用大量優(yōu)秀的例子?!?/p>

沒錯,如果可能,就永遠(yuǎn)別去教學(xué)生如何“面向?qū)ο蟆?,而是要讓他們陷在問題的海洋里,再加上有力的引導(dǎo),最終讓他們自己悟出面向?qū)ο蟮恼嬷B。

如果我有兒子。當(dāng)他成長到對愛情似懂非懂的青澀年齡時,我不想對他講一堆什么愛情啊責(zé)任啊的大道理。我也不希望他談第一個女朋友,就馬上順利地步入婚姻,我希望如果可能,他最好遇上些嫌貧愛富的女人,遇上些虛榮乖張的女人,然后被女人拋棄過,或拋棄過別人,然后命運再安排他遇上他的灰姑娘。

花花公子,情海里幾度沉浮,不輕易付出感情的男人,通常比那些遇上第一個女人就愛得死去活來的青澀男孩,更懂得愛情的真諦,在婚后也往往更不會愛上別的女人。為什么,因為隨便碰上個異性就愛得死去活來的人,通常他們愛的不是人,他們愛的是“愛情”這個東西,就算他們其實沒有足夠了解愛情中另一個人。

作為C++程序員,碰上任何一個問題,就要來扯上一通“面向?qū)ο蟆比绾稳绾蔚娜?在碰上真正問題時,往往比那些懂得簡單問題簡單解決的人,掛得早。因為他們的出發(fā)點是愛上了“面向?qū)ο蟆?,而不是了解所要解決的問題。

同樣的,作為一個C++愛好者,你可以愛上C++,但作為一個程序員,請別輕易說,我愛上了一門語言。愛容易讓人盲目;一個盲目的fans,是有力量的,他全身心地投入了學(xué)習(xí),真好;但一個盲目的程序員,是可怕的,他會以為,C++和愛情一樣,無所不能。

但具體到我個人,我有我的堅持,我決不愿意把我的學(xué)生培養(yǎng)成C++的粉絲(但,成為C++之父BS的粉絲,我熱烈支持:)。相反,我會“折磨”他們,《白話 C++》中的第二章《準(zhǔn)備》,已經(jīng)成功地讓很多學(xué)習(xí)者,發(fā)出哀怨:“學(xué)習(xí)C++,有必要去安裝、編譯這么多庫嗎? 還是Java好,一切都準(zhǔn)備好了?!?/p>

《準(zhǔn)備篇》的緒言,是一句煽情的話:“決定你能否成為程序員,不在于你的計算機(jī)基礎(chǔ),在于你是否有足夠的耐心?!?/p>

現(xiàn)在社會,有些女人或男人,會同時和幾個異性談戀愛,他們是勢利的。我當(dāng)然也反對這種不道德的行為。但如果是學(xué)習(xí)語言(無論是編程語言或自然語言),如果你有能力,我建議完全可以同時學(xué)習(xí)兩門,學(xué)習(xí)上越“勢利”越好,而有能力時,同時學(xué)習(xí)多門語言,那是相當(dāng)?shù)挠欣蓤D,具體有機(jī)會再展開。通常一個人對在C++語言熟練之后,就具備了這個能力。對于從沒有學(xué)習(xí)過其它編程語言的初學(xué)者,同時學(xué)習(xí)C++語言之外,還要學(xué)習(xí)另一門,不現(xiàn)實。但是,當(dāng)我們僅僅限定C++編程的范疇,那就一定不能癡癡,長期地把精力和愛心都放在語言自身上。

C++之所以復(fù)雜,是因為C++的“深度”與“廣度”都很深遠(yuǎn),但是遵循“有一定深度,擴(kuò)大廣度,有一定廣度,加深度”的方法,會發(fā)現(xiàn)C++的“深度”與“廣度”會成為我們編程中的一點樂趣。希望本文會給讀者帶來收獲。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2084

    瀏覽量

    73300

原文標(biāo)題:從深度和廣度談C++的復(fù)雜度

文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C++避坑指南

    C++是一門古老的語言,但仍然在不間斷更新中,不斷引用新特性。但與此同時 C++又甩不掉巨大的歷史包袱,并且 C++的設(shè)計初衷和理念造成了 C++異常
    發(fā)表于 09-15 09:04 ?511次閱讀

    C語言與C++的區(qū)別

    在很大程度上,C++C的超集,這意味著一個有效的C程序也是一個有效的C++程序。
    發(fā)表于 09-16 10:20 ?1068次閱讀

    CC++中const的用法比較

    #define一樣不占空間,但擁有類型安全檢查和作用域控制)。因此上述不能編譯通過的C代碼,在C++中可以順利地通過。當(dāng)不需要分配空間時(這依賴于數(shù)據(jù)類型的復(fù)雜度和編譯器的智能化程度)
    發(fā)表于 11-11 10:00

    c++程序設(shè)計語言題解

    c++程序設(shè)計語言題解是與Bjarne Stroustrup的《C++程序設(shè)計語言》一書配套使用的習(xí)題解答,為C++程序設(shè)計
    發(fā)表于 09-05 16:00 ?121次下載
    <b class='flag-5'>c++</b>程序設(shè)計語言題解

    C++課件、習(xí)題及答案

    *1.1  CC++*1.2  最簡單的C++程序 1.3  C++程序的構(gòu)成和書寫形式&nbs
    發(fā)表于 09-08 09:35 ?108次下載
    <b class='flag-5'>C++</b>課件、習(xí)題及答案

    詳述不用c++寫網(wǎng)頁的理由

    C++在web開發(fā)中地位如何,進(jìn)來一探究竟吧。
    的頭像 發(fā)表于 12-22 10:07 ?5861次閱讀

    如何C轉(zhuǎn)向C++ Effective C++ PDF中文版教材免費下載

    對每個人來說,習(xí)慣 C++需要一些時間,對于已經(jīng)熟悉C 的程序員來說,這個過程尤其令人苦惱。因為CC++的子集,所有的C 的技術(shù)都可以繼
    發(fā)表于 01-10 16:48 ?0次下載

    C++程序設(shè)計教程之C++的初步知識的詳細(xì)資料說明

    C++程序設(shè)計教程之C++的初步知識的詳細(xì)資料說明包括了:1. CC++,2 . 最簡單的C++
    發(fā)表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設(shè)計教程之<b class='flag-5'>C++</b>的初步知識的詳細(xì)資料說明

    如何深度解析C++拷貝構(gòu)造函數(shù)詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何深度解析C++拷貝構(gòu)造函數(shù)詳細(xì)資料說明。
    發(fā)表于 07-05 17:41 ?0次下載
    如何<b class='flag-5'>深度</b>解析<b class='flag-5'>C++</b>拷貝構(gòu)造函數(shù)詳細(xì)資料說明

    如何使用Borland C++ Builder6.0開發(fā)OpenCV的程序

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用Borland C++ Builder6.0開發(fā)OpenCV的程序。
    發(fā)表于 05-26 17:32 ?14次下載
    如何使用Borland <b class='flag-5'>C++</b> Builder6.0<b class='flag-5'>來</b>開發(fā)OpenCV的程序

    C語言與C++相互調(diào)用

    ? ? 1CC++相互調(diào)用 在一個嵌入式系統(tǒng)中大部分的底層和驅(qū)動層更多的是采用C語言進(jìn)行開發(fā),而上層應(yīng)用、服務(wù)更多的采用C++等高級語言
    的頭像 發(fā)表于 01-18 11:05 ?3176次閱讀
    <b class='flag-5'>C</b>語言與<b class='flag-5'>C++</b>相互調(diào)用

    EE-128:C++中的DSP:C++調(diào)用匯編類成員函數(shù)

    EE-128:C++中的DSP:C++調(diào)用匯編類成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b>中的DSP:<b class='flag-5'>從</b><b class='flag-5'>C++</b>調(diào)用匯編類成員函數(shù)

    測量深度廣度判斷AI算法的潛力

    算法的潛力會受到感測能力的限制。開爾文勛爵曾經(jīng)的名言至今仍不過時――“無法測量,則無法改進(jìn)”。要想了解 AI 的真正能力,請務(wù)必從分析其測量的廣度深度開始。
    的頭像 發(fā)表于 01-16 09:33 ?633次閱讀

    深度解析C++中的虛函數(shù)

    虛函數(shù)作為C++的重要特性,讓人又愛又怕,愛它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語法的偽裝,重新認(rèn)識一下虛函數(shù)。 虛函數(shù)是C++實現(xiàn)面向?qū)ο笤O(shè)計及多態(tài)特性
    的頭像 發(fā)表于 02-15 11:14 ?737次閱讀
    <b class='flag-5'>深度</b>解析<b class='flag-5'>C++</b>中的虛函數(shù)

    C++的引用和指針

    之前的文章我們已經(jīng)介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會著重介紹
    的頭像 發(fā)表于 03-17 14:00 ?549次閱讀