在 Linux 下學習 C 語言有什麼好處?

看到很多大牛說在linux下學習C語言比較好,我是初學者,在windows和linux平台下都試過了,比如,我在windows下,用的dev c++,寫好源代碼後,按F11,自動編譯,運行,我檢查下結果是否正確。

在linux下,我調用vim hello.c來編寫源代碼,然後:wq退出,然後調用gcc -o hello hello.c來編譯,然後./hello運行程序。

除了在linux下更麻煩一點,我沒有看出在linux下學到了更多的東西啊?

我就想問問,我在linux下學習C有什麼好處,我感覺更麻煩啊,難道就是為了學那幾個命令行嗎?


我們一點點來。

首先回答你那個使用編譯器的對比,Linux下的正確用法應該是這樣的(當然,只是其中之一的「正確用法」):

&>mkdir hello

&>cd hello

&>screen

&>vi hello.c

#完成程序

#不退出vi,繼續:e Makefile,完成Makefile的編寫

#(繼續不退出vi,下同):make 編譯程序,並完成代碼修改

# :e .gdbinit,編寫gdb腳本,比如加上file hello, break the_hellp_function; run等命令

#^A c創建新的窗口

#運行,調試程序,並通過^A ^A切換窗口

這個效率肯定比你在Windows下大部分工具都高,這就是Unix的思想(之一)——所有重複的動作,全部用腳本解決。你不會的時候當然GUI效率高,你會的時候,當然是腳本效率高,因為所有重複的動作都會變成一個動作。

好了,我們進一步深入進去。現在我問個問題,你的hello world程序調用了一個printf,這個printf是哪裡定義的?如何實現的?你既然學習C語言,總得知道它是怎麼工作起來的吧?在Windows的GUI程序封裝下,你怎麼知道你的程序是怎麼編譯出來的呢?

在Ubuntu下,你可以這樣:

&> gcc -v hello.c -o hello

這樣你完整地知道整個編譯,彙編,鏈接過程是怎麼樣的,你甚至可以要求留下中間的任何一個結果,以供分析。

或者你可以簡單做這個動作來看printf是哪裡定義的:

&>LD_DEBUG=bindings ./hello

你會發現printf調的是puts,在比如/lib/x86_64-linux-gnu/libc.so.6中定義的。知道這個文件是哪個,你可以可以查找它所在的包:

&>dpkg -S /lib/x86_64-linux-gnu/libc.so.6

知道是哪個包,你可以直接下載它的源代碼:

&>apt-get source libc6

然後你就可以開始修改這個代碼,重新編譯它,調試或者運行整個程序了...

看到了嗎?使用Linux,你手中的整個操作系統,包括支持你運行C語言的一切工具的源代碼,都是對你公開的。你問為什麼學習C語言要用Linux?這就是原因,你將有一個完全敞開的語言世界。

最後,如果你學的是C語言,C語言在Windows下早就式弱了,只有在Linux中才生生不息,這裡有最濃厚的C語言文化,autotool等原生工具會告訴你C語言的跨平台歷史和恩怨,而這些歷史,在Windows上已經泯滅了。

這怎麼說呢?C語言的libc的原始介面,在Windows下大部分都不再使用了,你不再用malloc來分配內存,你會更多使用HeapAlloc一類的介面(當然,不是說malloc不能用。但那更多是為了兼容,而不是開始就這樣設計的,下同),你也不用pthread_create來創建線程了,你用CreateThread(),實際上,大部分Windows的用戶程序微軟並不建議你用C來寫,所以你在Windows下學習C,也沒有什麼太多實際的價值,因為本來就不預期你這樣用。而Linux下是不同的,Linux很多基本程序就是指望你用C來寫的。

所以,題主問「學C語言最好的平台」,我想,真的是Linux無疑了,這不是基於情懷,這是基於成本和收益的。

當然,如果題主其實是為了找工作,根本不在乎學的是不是C,這就在我的回答之外了。


不會因為想玩遊戲而荒廢學業


這個要看你將來打算做什麼,如果只是單純的想學C語言、C語法,那麼在那個平台學都無所謂。如果將來打算從事 linux 相關的開發,那麼最好還是要提前熟悉一些 linux 系統API,以及常用的命令、開發調試環境和工具等。

至於你說的在linux下麻煩,這不是什麼問題,寫個Makefile就可以解決了,編譯的時候敲make就自動執行編譯:

CC = gcc
CPPFLAGS = -Wall -g
TARGETS = hello

.PHONY:all clean

all:$(TARGETS)

clean:
#命令前是一個tab不是空格
$(RM) -rf *.o a.out $(TARGETS)


我對C語言懂的不多,不過我想解釋一下為什麼有人會覺得 Linux 更麻煩。主要的原因, 就是他們還沒學會怎麼用。就說題主的例子,他是這樣做的:

  1. vim: wq
  2. terminal: g++ hello.c -o hello
  3. termainl: ./hello
  4. vim hello.c

我希望題主知道這些命令是可以通過方向鍵找回歷史的(真見過有人每次重新輸入的)。

實際上他可以這樣:

  1. :wq
  2. g++ hello.c -o hello ./hello
  3. vim hello.c

更快一點, 不用退出 vim:

  1. vim: !g++ % -o a ./a

更快一點:

  1. vim: map & :!g++ % -o a ./a&

只要執行一次(或者直接放vimrc裡面),之後每次按F11就編譯運行了。

總結起來,當你沒有認真去學一樣東西的時候,你是很難對它做出客觀的評價的。

============= Update =====================

好像答漏了問題。在 Linux 環境下學習 C 語言有什麼好處? 剛開始學其實區別

不大,區別在後面會體現出來。當你想看別人的代碼是怎麼寫的時候,在 Github, Sourceforge, Google Code 這些地方能找到大量開源的項目。這些項目,由於C的可移植性,有很多是只能運行在Linux下面的。雖然沒有嚴格統計過, 但我覺得在C開源小項目上, Linux項目的數量是比Windows項目多很多的。

另外的好處,就是 Linux 對編程語言的學習較 Windows 有很大優勢。你不可能一輩子只學C語言吧? 以後學其他語言的時候,看官網學學語法,然後操起 Vim 就能開幹了。例如某天你決定學 Python 了,只需要把 Python 裝好(5分鐘以內足夠) ,打開 Vim,把找來的代碼貼進Vim,然後來句 :!python % ... Bom!你感覺自己又學會一門語言了,個中的成就感只有經歷過才能體會。反觀 Windows 下面的同學,還在究竟IDE的問題:

"IDLE 怎麼那麼難用?「

"聽說大家都是用 PyCharm 的?「

"Visual Studo 也可以用來寫 Python 啊"

"呵呵,我有好多可以選,好開心"

以上。


很多時候,「學習C語言」指的不是K R,而是系統編程,。從就業來看,linux的高收入崗位無疑更多。相關書籍《Linux/UNIX系統編程手冊(上、下冊)》或者Linux系統編程(第2版)

我個人認為windows系統編程其實後期學習難度更大,因為不開源,你不知道它裡面的原理。

linux內核是開源的(當然你願不願意學習或者能不能看懂是另一回事)

系統編程的意義在於:如果你是個c#程序員,想進階看看CLR via C#,你不懂windows系統編程立馬歇菜,只能回頭補。

如果你是個linux下的php程序員,那些模塊很多都是c寫的,你不懂linux系統編程,出了問題只能幹瞪眼了。

學習c的意義在於,便於學習很多其它知識,比如csapp,編譯原理,等等。

學習linux c的意義在於,你學了linux系統編程方便學java(我指伺服器端,不是手機編程)。

java的優點在於,好找工作,將來好換工作,工作從幾k到幾十k的崗位都不少,這點其它語言拍馬難及。

還有,比語言,c#甩java老遠,但是找工作首先是開發軟體,伺服器端最重量級的軟體很多都是java開發的,從樓主學命令行都嫌麻煩的態度看,你直接裝個不要錢的Eclipse學java吧,網上安裝教程大把,也不用怎麼折騰命令行。

結論:學習linux c方便畢業找工作(需求最多)。當然你要立志將來像 @vczh 那樣橫推各種語言的話,那就另當別論了。

==補充========

從基礎的角度講:演算法(第4版) 和 編程語言實現模式 以及深入理解計算機系統(原書第2版)是我覺得比較重要和實用的。

還有,工作中選擇什麼語言是因地制宜的,很多「應用技術」,比如XXX如何配置,如何調優,如何排錯,XXX框架如何使用,等等,都是建立在對系統編程和語言的深入掌握上的,學習演算法和體系結構就是為了深入理解語言和操作系統。

基礎打不牢,遇到問題google不出來只能幹瞪眼了。基礎才是拉開不同程序員差距的本質原因,基礎打牢了,學什麼都快。

最後,我的回答是建立在假設以後你從事linux系統編程的前提下的。

用什麼語言,選什麼IDE,如果你不想折騰,直接Eclipse CDT吧,vim等你折騰到能像Eclipse那樣工作,估計你已經瘋了。

工具只是錦上添花,能不能提高效率是要靠使用者的,如果你對vim,emacs一竅不通,或者記不住各種IDE快捷鍵,不會有多大損失(我就不愛折騰),基本功打不牢以後要花很多時間補你就悔之晚矣了。


個人見解,請多指教

1. linux != vim (雖然我是 vim 黨)

linux 下也有很多方便的 IDE。你現在寫的代碼比較短,我推薦輕量化的 Geany

2. linux 系統對於數組越界等錯誤更加嚴格

@vczh 提到,

只要你是一個好學的人,相信你不會因為工具稱手就學不到東西的。

這句話我贊同。不過,我不認為 Linux 下的工具不稱手


既然邀我了我就簡單說一點,其他的大家都說了不少了,就不班門弄斧了。

編程語言,操作系統/平台只不過是工具和媒介,學程序設計最終要學的是思想,就像大師高德納說的一樣。


用LINUX學習C有什麼好處,這個好處你可以看這句話:C就是UNIX,UNIX就是C。

UNIX和C語言捆綁的有多緊密,沒有C就沒有UNIX。

LINUX是unix的一個分支,所以,用LINUX學習C有無限多的好處。

如果真的把C只認為是一種計算機語言而已,我認為真的錯了。在除了UNIX系列上談C語言,都要談到一個概念叫C runtime環境,UNIX系統本身就是C runtime環境,這是為什麼說用LINUX學習C有很大的好處的根本原因。

如果你要談的是開發環境,我回答的內容和開發環境無關。


剛開始學的話無所謂。學到後面必須接觸posix api,你自己看著辦。

另外不用糾結是否用ide。命令行是手工作坊的做法,要碰到大項目幾百個文件一個一個寫到makefile里得累死。


為什麼要用wq命令?為什麼不開個虛擬控制台專門做編譯的工作,另一個專門寫代碼?另,Linux下面也有一些IDE可用


補充一下輪子哥的答案。

在 win 下如果不想使用自動化的工具,而是想像其他答案說的那樣「了解程序裝配過程」, win 下也有許多工具能滿足你。

Linux 下的主流編程工具都有對應的 win 版本


如果會學的話,可以把vim, Makefile, bash/zsh, window manager之類的一起學了

只是C的話,真的沒有什麼特別的好處.........


我是一名工作多年的C語言軟體工程師。建議初學者還是先從Window 上開始學習。

還有力推 Linux 的那幫人,我不清楚是不是你們覺得用 Linux 可以讓自己顯得高逼格一些,Linux下任何操作都得用命令 (別提圖形化的工具了,用戶體驗極差),想搭建個開發環境,就得一行行的敲命令,yum update, install, 裝好了 gcc, 還得裝 gdb, 不然還得弄個g++, 然後呢?沒法編譯,因為沒設置環境變數,好了去設置環境變數吧,好了一切弄好了,開始寫代碼,咋寫?用 vim, 插入保存換行,你都得記住這些命令,記不住?記在小本子上!然後弄了個工程,有10幾個文件需要編譯?咋整?寫 makefile 吧。

看見了么?還沒開始搞C語言,Linux 環境都得先把初學者弄懵逼。

VS多麼好的 IDE 啊,有人幫你搞定了一切的環境問題,在這裡你安心的編程就好了。也許有人說,VS 把一切都包進去,讓開發者有時覺得太傻瓜了,不夠透明,那麼我想說,你已經不是初學者了。

高手們直接去用Linux好了,VS 真的很適合初學者


在linux下「學會」C語言沒有任何優越感可言,在linux下「編程」才會有快感,多線程,多進程,ipc,信號燈,共享內存,管道,交叉編譯,修改內核等等等等。windows很好,但至少對我來說絕對沒有linux那麼快樂。如果你只是想掌握C語言那兩個對你來說基本沒差,如果你是自己愛好編程。linux這種生命在於折騰的系統絕對比windows更適合你。

換句簡單的話來說,想獲得優越感,那是白搭;想獲得快樂,試試linux,免費正版開源安全自由無毒的世界等你探索。

。。。。。。。。。。。。。。。題外話的分割線。。。。。。。。。。。。。。。。。。

和樓上有位仁兄相反,我如果是教師的話首先就得讓孩子們習慣命令行,理由很簡單。由簡入奢易,由奢入簡難。連命令行都能接受,以後就沒神馬不能接受的了。

打擊學生信心這種事情根本不存在,做IT的童鞋都是從這條路上過來的,不會寫程序的同學就是不會寫程序,和用神馬開發環境完全無關。給他用微軟的IDE也一樣,不會編程的一樣還是不會編程。況且,學校那種程度,連一個make file都不用上,單文件一個gcc命令會有多難?


2017.08.07 更新

剛開始接觸 Linux 時,建議在虛擬機中安裝,因為在本機上直接安裝 Linux 可能會遇到各種問題,很讓人不知所措。

先說說我在 Linux 下學到的東西。我現在可以手不離開鍵盤用 Vim 寫代碼,在閱讀代碼時通過 ctags 在不同文件中跳轉,用 Makefile 構建代碼,用 GDB 調試,了解動態庫、靜態庫的區別,鏈接的過程等。這些都是我在用 Windows 時一直沒有學到的。

就 C 而言,說幾個 Linux 的好處:

1. 環境配置簡單

一條命令就行,如果是 Debian 系,就是 sudo apt-get install build-essential;如果是Fedora一類,就是 su -c "yum groupinstall development-tools",一條命令而已,這對於自己寫小項目足夠了。

2. 查手冊方便

在 Linux 下如果你不清楚一個庫函數的用法,直接man,還鍛煉英語了。如果想了解man,那就先 man man。

3. 文本編輯器的選擇

除了 vim,還可以選擇 gedit 等編輯器。不過建議學好 vi/vim。因為玩 Linux,如果系統宕掉,進入單用戶模式時,你就只能用 vi。vim可以作為一個平行於 C 語言的學習方向,一邊用 gedit 學 C,一邊學 vim,等 vim 練熟之後再用 vim 寫 C。vim 的學習可以看這裡:簡明 Vim 練級攻略(我就是在這兒學的。)

可選的擴展閱讀:手把手教你把Vim改裝成一個IDE編程環境(圖文)

4. 高效使用 Linux 的命令行

一遍又一遍地打命令很乏味?在 Linux 的命令行下工作,要學會幾個技巧:

學會用Tab補全命令;

學用用ctrl-r查詢歷史命令;

學會用上下鍵查詢上一條下一條命令。

先說這些,上面的內容練熟之後,就可以進階了,進階的內容有:

Makefile,GDB,Linux 常用命令(grep、find 等,讀源碼時會用到,同樣用 man 學習它們的用法),cscope。

在 Linux 下學 C,就是先專註語言本身,其他的東西先本著夠用的原則,學 C 的同時,一點點地去學習它們就可以了。

最後,推薦一個 Linux 下學習 C 語言的教程:Learn C The Hard Way

還有一本關於 C 的書:Expert C programming(http://book.douban.com/subject/1784687)


題主,眼光放大點,linux上,qtcreator kdevelop netbeans eclipse anjuta codeblocks 等等等等哪個都好用啊!


你先把 Compiler 和 IDE 的概念搞清楚。讓一個軟體幫你調用 gcc 和你自己就命令行調用 gcc 這在難度上沒有什麼區別好嘛,這是完全一樣的過程。


反正Linux 下遊戲對你的誘惑比win小很多:)


好處就是你能學到很多Linux開發的相關知識

壞處就是你學不到Windows開發的相關知識

並且你還享用不到Windows下比Linux好用的多的開發環境

並且你要是想玩遊戲上QQ什麼的還得切換回Windows

並且你還得忍受Linux難用又不穩定的桌面


因為足夠簡單啊同學。無非是敲幾個命令,對智商沒要求的,再笨都可以抄在小本子上記下來。

你到Windows下,光學習VS怎麼建個新項目什麼的就折騰半天,像我這種不糾結不舒服的,十分好奇每個選項勾上不勾上都是什麼意思,就更慢了。

到Linux或者BSD下,無非就是編輯個文本文件,讓編譯器處理一下,就有結果了,你不需要記住在某個界面點某個選項,萬一不小心選錯了選項怎麼辦。你的注意力都集中在語言自身上了。


推薦閱讀:

C語言如何不用goto、多處return進行錯誤處理?
有誰是完全使用Linux的,辦公 娛樂各方面可以脫離windows應用?
有沒有基於Debian、滾動發行、能第一時間收到安全補丁、kernel版本更新最快的Linux發行版?
哪些Linux發行版是滾動發行(Rolling Release)的?
大型c++項目在linux下如何調試?

TAG:編程 | Linux | C編程語言 |