作為非計算機專業的學生,覺得 C 語言遠比其他語言易於上手,正常嗎?
我想說:我真的覺得除了C以外的語言都不是人學的啊!!!!!!!!
**********************************************************************************額不吐槽了,說說提這個問題的動機。最近逛知乎看到這個問題。學 Python 發現學一門編程語言很難,有哪些學好編程的方法或技巧?下面的回答:
然後近期做圖像處理的時候用matlab,看到了這個問題:如何學好 MATLAB?最近微軟開源了.net,於是我看到了這個問題:順便截個輪子哥的圖(這裡沒有特別的意思,我也不是程序員,大概我也不需要賣燒餅)
難道真的只有我覺得C的語法是最簡明易懂的嗎?本人大三在讀。學校教授的課程包括C語言和C++程序設計。本人非計算機專業,做大作業(演算法實現居多)的時候也接觸過其他一些語言,但是不出幾個小時,便覺得頭疼欲裂,各種新鮮的概念實在是無法塞入腦中。在我的直觀感受中,C的指針,變數,內存管理,位操作是最為直觀的,不出一兩個小時就能上手,經過一段時間的使用,比較基礎的作用域,變數訪問許可權,封裝的概念也易於理解。反而是python的字典和類結構,繁複無比,玄而又玄。而且當我發現一個變數竟然類型是自動的,當我想著1+2是等於12還是等於3的時候,怎麼感覺所謂「簡單易學的高級語言」反而更加「令人專註於過程而不是演算法本身」了呢?C#.net在老師要求交GUI作業的時候試著做過,然後我發現竟然不能通過指針來訪問所需要的變數。然後就是各種變數和函數聲明的嚴苛限制。一個程序半天都編譯不過,各種不允許聲明函數,這要如何提升工作的效率呢?聽說知乎程序員多,在此吐槽發問,敬請各位指教,請勿以「某某語言極為簡單」為基本假設進行考量。鄙人不是專業的程序員,若要嘴仗,請出門右轉。
因為你也說了「做大作業(演算法實現居多)」,不能刻舟求劍不是?
看一句話,首先要看這句話是誰說的,其次要看這句話是在什麼背景下說的
vczh 整天安利 C# 大法好,那是因為人家是從 C++ 一路過來的,比我們這些把 C++ 當成「帶著 Class 的 C 」來寫的渣不知道高到哪裡去了
相比寫起來就像「穿著冰刀在打過蠟的地板上跳舞」的 C++ 以及跟在 C# 後面抄各種特性還抄不好外加類型系統還不封閉外加泛型實現蠢爆了的 Java ,對於有一點面向對象語言基礎的人來說,當然是 C# 學起來爽寫起來也爽了,不推薦這個推薦啥?
別人說 Matlab 簡單,那是因為真的簡單啊
解釋執行,不用等編譯然後一遍一遍 Debug,簡單不?
矩陣轉置只要寫一個"就可以了,跟線性代數課本寫法都一樣,簡單不?
各種 ToolBox,你能想到的這裡都有,現成的各種濾波、圖像處理、信號處理演算法實現,簡單不?
自帶繪圖和可視化工具,數據處理完直接畫一個漂亮的圖出來貼到 PPT 里,簡單不?
難道真的只有我覺得C的語法是最簡明易懂的嗎?
其實你的感覺沒錯,單論語法來說,C 的語法確實夠簡單了
在我的直觀感受中,C的指針,變數,內存管理,位操作是最為直觀的
「直觀」這個就不好說了,還是得看你寫的程序是做什麼的
做演算法題打 OJ ,那 C 是夠直觀的,上來開個長度 10000 的數組然後一堆 Struct 排開,指針想飛到哪裡就飛到哪裡,這酸爽,不敢相信
寫操作系統,寫什麼內核模塊和系統調用,寫什麼 DMA 驅動,操作內存地址多直觀
處理數據呢?處理 Excel 文件呢?你用 C 裸寫一個看看?Python 那邊 import csv 已經搞定了估計這邊還在處理換行符吧?
開一個測試用的 HTTP 伺服器呢?用 Socket 從底層開始寫? Python SimpleHTTPServer 在看著你
寫爬蟲?這就更沒邊了,反正我是沒見過哪位用 C 語言寫爬蟲,當年我用 Python 寫,以為憑藉 requests 這種庫開發效率已經夠高了,後來才知道 C# 裡面還有一個 webbrowser 類,誰用誰知道
反而是python的字典和類結構,繁複無比,玄而又玄。
不知道你說的「字典和類結構」具體指的是什麼,不過 Python 那個作用域規則確實挺奇葩的,甚至有 global 這種關鍵字,字典之類的真沒看出來繁複
而且當我發現一個變數竟然類型是自動的,當我想著1+2是等於12還是等於3的時候,怎麼感覺所謂「簡單易學的高級語言」反而更加「令人專註於過程而不是演算法本身」了呢?
你最後一句話說的太對了,高級語言就是為了屏蔽那些浪費程序員時間的所謂「細節」,讓人專註於高層的設計和邏輯。另外我很好奇,除了某些奇葩語言,沒有其他語言把1 + 2的結果輸出成12吧?當然如果你非要重載+號運算符那我沒話說
總結一下,有幾點:
語法的「簡單」,只是評價一門編程語言「簡單」與否的其中一個維度
這門語言有完備的標準庫么?有的話寫應用就簡單啊
這門語言方便擴展么?有的話寫 DSL 造輪子就簡單啊
這門語言方便實行編程規範和協同開發么?一個 Java 老手讀一個 Java 菜鳥的代碼,跟一個 Ruby 老手讀一個 Ruby 新手的代碼,你覺得哪個會更困難一些?
這門語言方便兼容多範式么?你翻翻 Gtk 的源碼,你覺得那種寫法跟如今所謂的面向對象有多大區別?你看看 C++ 的模板,什麼花兒玩不出來?
這麼多維度,哪個可以用來判定一門編程語言是否「簡單」?
做工程和做數據結構的大作業,對語言特性的要求是不同的
做數據結構和底層,那麼無關的語法糖和封裝越少越好,就是要有拳拳到肉的爽快感,既然程序猿知道自己在做什麼,那麼他就應該為他自己的代碼負責
做工程,為了模塊劃分清晰以及協同開發,就需要各種封裝,比如類,比如 Property,比如 Interface;為了加快開發速度減少浪費在重複造輪子上的時間,就要有各種標準庫,拿來用就可以了,而且人家標準庫一般比你自己寫的要好得多
======================================================================
最後,對於覺得 C 語言易於上手的人,我一般都推薦兩個辦法:
一個是去玩任天堂的遊戲,然後一邊玩一邊念:上手易,精通難
另一個是去翻 Linux 的源碼,然後一邊翻一邊念:這裡我看得懂
念到懷疑人生為止
======================================================================
評論里看到題主說「對,別人工程都做完了我還在困惑.net的方法,欄位,事件都是個啥玩意」,於是補充一點
對於你的困惑,大概是兩方面造成的
一是缺乏對於現代編程語言和編程範式的認識和理解
可以嘗試著去看一些介紹面向對象的文章以及設計模式的文章,一邊看一邊想這裡用 C# 可以怎麼實現,C# 的那個特性是出於什麼目的被添加進來的,然後結合工程實踐加深理解
所謂的方法、欄位、事件,這些編程範式或者編程模式,說到底也就兩大塊:抽象與封裝
抽象指的是對現實世界的建模或者說模擬
有的人認為程序對現實世界抽象就是一個接著一個的流水線式操作,所以他們用 C,寫上一個個的函數和流程跳轉,然後管自己叫「過程式語言」
有的人認為程序對現實世界抽象就是一個接著一個的對象,對象之間協商介面,通過繼承來模擬現實世界事物之間的關係,通過消息傳遞來通信,所以他們用 C# 和 Java,然後管自己叫「面向對象式語言」
有的人認為程序對現實世界抽象應該是函數運算與表達式,所有的操作都應該抽象成函數調用,所以他們用 Haskell,然後管自己叫「函數式語言」
還有的人不知道程序對現實世界抽象是什麼樣子的,所以他們管自己叫「多範式語言」
233
封裝就更好理解了
一種封裝是為了向上屏蔽底層的實現,對上層編程者透明,比如 JVM 封裝了一個 Java 語言的運行環境,理想狀況下我並不需要知道底層是 ARM Linux 還是 Windows;包括網路中的封裝也是如此,不管是五層還是七層,都是為了屏蔽下一層的實現
還有一種封裝是為了隱藏內部實現,比如我把數據都封裝到類裡面,你能調用我公開的方法,但是你不能瞎改我內部的代碼然後大半夜打電話喊我說為毛老子的代碼又崩潰了
還有一種封裝是為了代碼復用,寫 C 語言寫多了覺得這個快排沒必要每次都寫一遍吧,所以寫個函數封裝進去,下次直接調;寫 Java 寫多了覺得這幾個類有共同的初始化操作,所以寫個父類把init過程封裝進去,幾個類的差別用繼承然後重載來實現
說白了就這麼回事,多寫點就懂了
二是其實是現在的一些編程書造成的,編程這個行當很多人有個「不說人話」的毛病
有的人是故意拽詞來嚇唬初學者,什麼「模式」「範式」「思想」掉書袋一大堆,其實用大白話來說就是挺簡單的事情
什麼「輪詢」,不就是「我過一會就去問問再過一會再去問問」的意思么?
什麼「回調」,不就是「我告訴你如果某件事發生了該調用哪個函數」的意思么?
除此以外,還有些是為了描述的準確性不得不犧牲易讀性
比如 Haskell 那個經典的梗「 Monad 不就是一個自函子範疇上的幺半群,這有什麼難以理解的」
如果你去看一下自函子和幺半群的概念,你會發現這確實是對 Monad 最簡明扼要準確的描述了
可是未免也太艱澀了吧?
所以我很希望能有人寫一本書,用「說人話」的方式把一些編程的概念通俗易懂地介紹出來,可惜現在還沒有見到,或許一些知名博主的博客已經部分有了這個功能謝 @袁偉哲 喵
其實只會C是很正常的事情,比如現在的pTeX-ng開發者的黑歷史上大學,後來證實,他大學期間覺得有意義的事情是睡覺和被請吃飯。
花了幾百塊錢弄了個電腦,開始用Linux,碰到了TeX,首先用的是CJK處理文件。期間使用過Groff和Docbook。刻了五張Debian 5的碟片,用了不少開源軟體。看了一堆Linux的書。想學個編程語言,學Pascal未遂,學Matlab未遂,學C++未遂,學Python未遂,後來學了C。雖然他以前學過Basic語言。其後他的工作環境:Ubuntu/Debian/Slackware。
好了,黑歷史講完了,我們來干點正事。
Form Follows Function
實際上,你說你只熟悉C指的是你只熟悉C描述問題的方法,C常常解決的問題。
所以現在你的問題應該是去看看 python 常常處理什麼問題, matlab 常常處理什麼問題, C# 常常處理什麼問題。
也就是說, matlab 你應該和matrix, 降維, 信號分析一起學; C# 應該和設計模式什麼一起學; Python 你應該先學 Perl 和 IO/字元串 然後就能理解如果有些人抱著過程式和 C 不放手就是這樣的結果。我之前也犯了類似的錯誤,我在學LaTeX的時候以為可以不是很麻煩就能夠隨意排出想要的效果。但是最後獲得的理解是,如果想要排出想要的效果,一定會很麻煩;但是麻煩結束後,代碼是怎麼寫的,排出來就是什麼樣子的。
反正就是,理解問題才能理解工具。
就醬正常。就像圍棋一樣,剛學的時候覺得超簡單,規則清晰明了,幾盤就上手。相比較而言,象棋什麼的就要稍複雜一點兒。但是我覺得要想把圍棋下好,比下好象棋難呀!所以所謂難易只是角度不同而已,沒什麼。
易於上手?C ?
你換一個角度看。
C 是很久之前就有了的,幾十年間每種語言都有所發展,也產生了更多的各種各樣的語言,總的趨勢是不斷細分的。在各個方面都能找到超越 C 語言的存在,有的更適合數學計算,有的更適合構建企業級應用,有的語法簡單靈活多變……
沒有理由單單「易於上手」這一方面在這幾十年都毫無發展,導致沒人能超過 C 語言吧。
更何況,你把專為教學用途設計的語言排到哪裡去了?我小學時候用 LOGO 入門,連 PI 都沒搞明白,用 REPEAT 畫個弧線老師教了半節課,難道換成 C?一個指針全班就都趴下了好么。
何況 LOGO 也不是最新的,Disney 之類的也出了些專為教育用的語言。
#還會用 FD 100 RT 90 的請點贊謝謝……#必須啊printf跟 system.out.print 哪個寫的費勁,一目了然
c語言這種沒有string,沒有容器,沒有模板,沒有正則,沒有反射,沒有oo,毫無現代編程語言特性,所有輪子自己造的語言,你居然還覺得它好用?WTF!
同時用c和c#的程序猿飄過。
c簡單不簡單?
簡單,確實簡單。c的方法哦不,,函數。總共沒有幾個。能#include的小褲褲也屈指可數。語言特性比較單一而且沒有什麼特異語法。大部分邏輯都可以在分支,循環這兩個大框上解決。那麼為啥大家說c難??因為c,做出來東西很難。做出產品寫好代碼很難,寫好代碼控制效率更難,控制效率了易於維護更是難上加難。我寫的單片機內嵌邏輯從來都不用混淆,因為你反編譯你就能看懂?那才出鬼了。。那麼c在這些劣勢下為啥成為了工科大學的心頭好呢?
原因有2.1,簡單易用成本低。2,培養思維效果好。學c的時候大家可能用的是TC 3.0,或者VC++6.0,這些軟體對於學校來說成本很低。c入門簡單並不需要像java一會兒裝jde一會兒搞環境變數,也不需要c#先給我裝個.net。。。hello world一分鐘寫出來大家這個興奮啊!!!這個是原因一。原因2是c語言有極強的邏輯性。面向「過程」語言這個詞兒不是蓋的。你需要把精力完全投入到一個語言的邏輯上面去。這就讓c語言成為掌握某種演算法的極佳敲門磚。現在我想應用或改進某種演算法的時候我總會先使用demo數據在c上實踐。之後再去轉換為c#。所以c語言是很能培養人的邏輯思維能力的。這就給了我們一個學習的路口。要知道作為程序員你C都看不懂,在單方法邏輯上會比c語言達人弱很多的。所以,你感覺C簡單。是正常的。因為我們剛剛接觸的時候都覺得C簡單。
不過在繼續跟進學習的時候,我們發現面向對象的特性可以解決C不太好解決的問題。所以就都OOP了。。.net,java這些語言比c簡單么?一點也不!!!他們實現某種功能簡單。。可以試試新安裝一個OS要求寫一個從1加到100的小程序。用c,c#,java,python這些語言。。哪個完成的快。然後比較一下代碼量就好了。。結論:C語言語法簡單,但是應用難。說道python。。。對不起我真沒寫過幾行代碼還是讓輪哥他們指導我吧。非計算機專業?電子吧?而且做演算法,那c無疑了,跟硬體打交道,至少現在無人能取代!別管其他的,趁此機會深入研究C,另外如果要做windows平台的,也有LabWindows可以用,完全用C寫,做硬體的不二選擇!可惜這貨最近幾年才緩慢的為人所知!更可惡的是,NI公司似乎偏愛LabView而猛打廣告,不過LabWindows也從未停止更新過...讓我一直很奇怪!
你不能只用自己的思維習慣來定義語言的簡單與否,自己最初學編程形成的思維是怎樣,就認為計算思維一定是怎樣恐怕不太科學。不過每個人總有自己習慣的方式,脫離人群和應用背景談語言確實不太合適。
你連映射結構和類都覺得繁複無比,說明你做的東西太少。
學 Python 發現學一門編程語言很難,有哪些學好編程的方法或技巧? - 知乎用戶的回答借用我回答這個帖子的回答,其實編程語言本身只是語言,關鍵看你要干什。語言只是我們事實現編程的工具,理解計算機科學的本質思想最重要。詳細請看這個帖子。
看來我們學的不是一個Python……
我在初學的時候也感覺是這樣的,有時候會有這種情況,有些工具學起來簡單用起來難。之所以你覺得C語言簡單是因為C語言貼合硬體,移動一個指針就是內存定址器移動幾個數字,非常直觀,給人一種知其然又知其所以然的感覺。而其他語言除了彙編,都很難這麼和硬體聯繫起來。在上手C語言之前我還嘗試過basic和logo,那時完全不懂計算機原理,感覺整個就是一個magic,學起來基本就是記住簡單的映射關係,就好象按這個按鈕那個燈會亮一樣,這套規則記熟了其實也是很好上手的,相信很多非計算機專業的入門者都會這麼認為。但我當時就覺得很沒意思,因為我懶的記。所以當我第一次看譚浩強那本C語言編程的時候,我就有一種豁然開朗的感覺,因為譚浩強作為老師,很上道的從原理講起,一上來並不直接開始講C語言本身,而是先講位元組,位運算,內存管理,基本上算是把能幫助你理解計算機語言本質的相關知識做了一個最小子集出來,然後下面再看指針數組數據結構什麼的就完全無壓力了。以至於我就有一種「計算機語言難道不就應該是理所當然這樣設計的嗎?」的感覺。後來接觸其他語言都有一種天然的優越感。不過我得承認,matlab這種偏工程應用的語言是更容易上手的,C語言我學了兩個學期差不多算上手,matlab我學了一個星期基本就上手了。===============由於忘記拉黑,導致 @薛非這同學又出現在評論里,歡迎各位參觀。有沒聽說過薛非的請移步這裡:薛非寫的《品悟C》是一本什麼樣的書?以及這裡:2014年計算機圖書偽劣作者打假第一案!踢爆偽C大師garbageMan(薛非)的真實嘴臉。這一切的背後,到底是利益的驅動還是智商的無奈!其偽劣作品《品悟C》另,薛非就是幾年前知乎上著名的「程序員github決鬥事件」當事人之一。
我只單純說數據處理。C確實很簡單,但現在誰還用C,都是C++或C#了,你學一下這兩門,雖說在C基礎上,但難度高了好幾個數量級吧......
keep an open mind,只學C一門語言是百分之百學不好C的。當然不排除一種可能性,就是題主在只學C和只用到Windows/POSIX的API的前提下,自己寫啊寫,靠著宏和void*大法造出了各種神奇的數據結構,實現了其他語言一兩個關鍵字就能搞定的特性。。加油
別做玩具類程序,你應該用c和c#做幾個大一點的項目再比較一下。
那是因為你連c都不會…
彙編語言比c還要更簡單一些呢…
現在的語言是為了程序員開發出來的,是給程序員用的…
越後期的語言,功能越複雜,需要掌握的越多c確實是最簡單的語言。
覺得c艹簡單的話,說明你……算了我不說了,積口德。看你拿它幹啥……你想寫個圖形界面那c語言才叫反人類……c拿來描述演算法啥的是很不錯的,但是它簡單的語法本來也註定了它的複雜特性。有個日本人叫前橋和彌寫的一本書叫《征服C指針》(有中文的),整本書就光講指針,你讀一讀再體會一下c對初學者到底簡單還是難。
推薦閱讀:
※怎樣理解C語言是才是代碼的精髓,可以讓你領略不一樣的世界這句話?(其實就是怎麼翻譯成人話-_-#
※C語言C11為什麼選擇`thrd_create`這麼奇怪的命名?
※C和Python我該先學什麼?
※Linus Torvalds 開過哪些著名的嘴炮?
※c語言printf("xyz-123"+2)為什麼結果是z-123?