C 語言是學編程的基礎嗎?
我的專業是計算機科學與技術,大一時學c語言,但那時根本學不進。後來開了c#課,http://asp.net,開始對編程感興趣。但是數據結構上依然是完全不行,上機課只能對著電腦發獃.....
不是。
學編程的基礎是邏輯思維能力,一般人根本不明白他們的思維和邏輯嚴謹差得有多遠。c語言的確某種意義上來說是其他語言的基礎,因為它們的編譯器解釋器大多數用c實現。但是c語言不是其他語言的預備知識。
編程跟基礎科學的學習方式上最大的不同就是,編程是自頂向下的。如果你一定要先學c語言,不如從最底下開始,按照初等物理-&>大學物理-&>固體物理-&>半導體-&>基電、數電-&>組成原理-&>os、編譯-&>編程 來學習。然後你一看,WTF,我學了半天還不知道計算機是啥軟體是啥,然後再也不想學了。c語言確實是最接近底層的一門語言,但絕不是編程的基礎。
學編程不像其它學科要從最基礎(底層)學起,因為初學者不可能學會。數字電路 -&> 組成原理 -&>彙編 -&>C語言才是自底而上的學習路線,而這條路線走不通。自頂而下才是快速進階的好方法。所以國外很多大學大一先教python,底層不必懂,首先寫出能用的代碼才是王道!雖然此時你完全搞不懂代碼怎麼跑的,寫的代碼也效率很低,可是至少是入門了。
那C語言有什麼用呢,學了上面所說的底層之後你就十分清楚程序里的每一行轉化為彙編是怎麼樣的、內存是如何分配的、以及微指令如何控制CPU把數據傳輸到cache和寄存器然後執行的。然後你讀了csapp和程序猿的自我修養之類的書後能優化你的代碼,無論你用的什麼語言。懂了內存分配,用C語言寫出了一種數據結構,則其它任何語言都能寫出,反之則不然。
所以C語言也只有這些用處了,要學的東西還很多:數據結構與演算法、設計模式、軟體工程、網路協議以及【具體到某種語言的各種細節各種坑(做項目 + 刷stackoverflow + 看effective xxx之類書可習得)】,哪一項都很重要。編程已經是個高度細化的工作了. 很多方向不需要學C.
所有的語言都是編程工具。只要能完成需求,用bat實現,也是編程。
從純技術角度,編程的基礎是邏輯思維能力,所以我覺得《數據結構》可以算作是編程的基礎至少大學《數據結構》教材的查找、排序、堆、樹等要理解,認真看,認真學,當你認為你理解的時候,嘗試自己寫一個demo(這個很重要)。
其他的各種演算法類的東西,無論是學科內的還是網上找的,可以多看一些,強化自己的邏輯思維能力。看到那麼多黑C的,我倒是想補充一點我自己的經歷:
我是學C出身的,然後C++,MFC 後續接觸過WPF、QT、python等。我一直很慶幸我是學C出身,C確實很基礎,C也告訴了我什麼是基礎。所以後來無論接觸到其他什麼語言,對我來說只是工具更換導致不太順手而已,對於高級語言的垃圾回收啦等等便捷性的東西,理解起來也相對容易一些,不至於連垃圾是什麼都模稜兩可。現在適合拿出linus的名句了,編程的核心是設計(design),設計差了即使你用再牛逼的語言它也是一坨翔。java裡面設計非常多,為了正常工作你要寫一堆適配器。cpp中層次比較豐富,為了添加一個功能你必須看懂所有層次。 c啥都沒有,所有東西必須自己設計。所以基礎知識最重要。舉個例子,無論用啥語言(java、python、cpp)沒學過編譯原理你寫一個nginx配置文件解析器試一試。
看見答案里有同學說cpp是給用不好c的人用的。。。。也是醉了。。。。
C就像內功,練著很無趣,等以後學招式了,才知道有用
C語言可以讓你更好了解系統「內部」是如何運作的。
整體來說系統是一個分層的結構。我們看到的頁面一層一層向下解釋直到CPU中一個一個高高低低的電壓(0和1)。做為一個程序員如果只了解上層結構而不了解下層結構,就無法解決下層結構的問題。又因為上層結構很多東西也是按照下層結構的邏輯設計,了解底層也可以讓你更好的理解和學習各種上層結構的用法。
而C語言則是「高階」語言和彙編之間的橋樑,也是各種操作系統功能的具體實現。所以學操作系統和學習C語言是分不開的。
最後貼一個Java 和 C 實現簡單的Echo Server的對比Java:
import java.io.*;
import java.net.*;
public class echo3 {
public static void main(String args[]) {
ServerSocket echoServer = null;
String line;
DataInputStream is;
PrintStream os;
Socket clientSocket = null;
try {
echoServer = new ServerSocket(9999);
}
catch (IOException e) {
System.out.println(e);
}
try {
clientSocket = echoServer.accept();
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
while (true) {
line = is.readLine();
os.println(line);
}
}
catch (IOException e) {
System.out.println(e);
}
}
}
#include &
#include &
#include &
#include &
#include&
int main()
{
char str[100];
int listen_fd, comm_fd;
struct sockaddr_in servaddr;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
bzero( servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(22000);
bind(listen_fd, (struct sockaddr *) servaddr, sizeof(servaddr));
listen(listen_fd, 10);
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
while(1)
{
bzero( str, 100);
read(comm_fd,str,100);
printf("Echoing back - %s",str);
write(comm_fd, str, strlen(str)+1);
}
}
c語言用做入門語言簡直腦殘!!!c語言多用於底層,驅動一類的開發,一開始就學c會很痛苦的,尤其是c的指針,不懂硬體的工作原理,亂玩搞出野指針的,真能把人折磨死。要入門的多,學pyhton是不錯的選擇,語法簡單,容易上手而且功能強大。而且你都學過不止一門高級語言了。高級語言可以再看看中間件,設計模式啥的。學c前先看看數電模電,組成原理,微機原理,操作系統,網路原理最後在看點半導體物理,然後看點彙編就能對計算機的工作原理了解更深入,最後再去學c,理解硬體方面的就容易多了。c大多面向過程,理解上面這些很有必要。ps:拿c搞面向對象的孤以為,純屬娛樂。數據結構沒別的辦法,只能多練多想多實驗
語言只是工具,修房子的人管你是鋼筋還是木板
我們學校妓院的都從C艹開始學的。不過我是電子,我們院里只學個C,和彙編。數據結構你們不單獨開一門課么?我這個只學C不搞演算法的都開啊。--------------------其實服從學校安排就好,既然沒學好就補上來。老師教你C#,你自己在去學其它的,那就本末倒置了。學著A語言,做著老師布置的B語言的作業題和實驗報告,最後還要參加B語言的考試。最後可能A沒學好,B也掛科。
我感覺相對於有些學校把Java當作第一門語言,c還是可以的。因為大二開數據結構,大部分都是c語言的。有人說c太底層了,還有指針什麼的。但作為第一門語言,面向結構的語言,你來學習循環,控制,函數調用,c都是不錯的選擇,尤其是在看了c++之後再去看Java就簡單很多了。只是簡單的理解指針對學習類似於Java的語言很有幫助,你對內存模型理解的越深,對語言的學習就越好。一句話,主要看人。
入門編程時多考慮考慮底層沒什麼不好的,以後再學其他語言時就會觸類旁通,學的很快[C++除外,要不要逃
不是啊。學了C是讓你從機器的角度思考問題入門學C思維會比較難轉過來
入門Python好得多吧,環境輕量搭建又方便,容易上手,能力全面,用IDLE又沒有自動補全,適合練手。
推薦閱讀:
※在編程過程中boolean變數一般怎麼命名?
※計算機系的學生應該考什麼證?
※如何從學術原型代碼拓展成工業級別代碼?
※C++語言有什麼方便的GUI開發框架?
※程序員面試,面試官更注重代碼量、項目經驗還是操作系統、數據結構這種基礎課程?兩者比例是五五開還是多少?
TAG:編程 |