前言:由於有人要考C語言計算機二級,程式設計零基礎,要我入入門。我就把QQ聊天記錄整理一下,再把未講完的東西繼續講下去,希望為以後做類似工作也省省力。對於有多年程式設計經驗的資深程式設計師來說,這些著實小菜。而且由於為了應付二級考試,嚴格的說也不能算真正的計算機基礎講解。
但其實我想,基礎應該是最難的。硬體,作業系統,編譯器,演算法,哪一個不是計算機裡面最重要也是最難啃的部分?而對於一個沒有程式設計基礎的人來說,想去快速入門程式設計,只能以一種很傻瓜的方式去灌輸,只能把很多東西說的很淺顯,很死,甚至是錯誤。如果不是這樣,哪能讓一個人快速的上手呢?遙想自己當年學習c語言,從老師的嘴裡得來的,也不過是一些傻瓜的理解,而解決問題的方法,大都是在死記硬背。舉一才能反三,計算機世界有自己的邏輯,對於一個初學者來說,任你再聰明絕頂,也需要很長的時間消化理解計算機的邏輯,直到有一天這種邏輯深入骨髓。
(以下零基礎者慎入)
初學程式設計的時候,以為記憶體就是一個大廣場,你的程式隨意在裡面亂搭亂放。後來才知道,作業系統有虛擬記憶體管理,有虛擬地址向實體地址的轉換,有頁對映,有記憶體交換,有函式的棧空間,有全域性儲存空間,還有可以動態申請釋放的堆,甚至還有動態連結庫的儲存區域。這些過程中甚至有硬體直接參與,比如虛擬地址的翻譯。
初學程式設計的時候,以為用Turbo C的醜陋介面編譯出來的程式獨佔的享用CPU資源,以為“程式”就是計算機中的執行實體。殊不知作業系統有程式,還有執行緒,這些執行實體共享計算機的資源,並分時地執行在同一個CPU或者同一個CPU的同一個核心上。
至於演算法和資料結構,卻反而顯得不那麼難理解,不那麼會在你瞭解了之後發出“原來我之前的理解是如此天真”的驚歎。雖然演算法和資料結構的設計非常耗費腦力,需要不斷推敲氣正確性,效率,實現細節,可用性。。。
而在CPU、作業系統的上的一切序列的東西,到了GPU上又會被很大程度上顛覆。不過希望隨著GPU硬體的升級,和GPU程式設計環境的發展,以後在SPMD的處理器上程式設計會變得像在CPU上用vs gcc那樣方便、容易,而不用考慮過多硬體的細節。
說的有些多了,進入正題吧。先講寫粗略的概念,更細節的有時間再說吧,更像一個學習的指導,還是需要看書才能真正理解的。另外,都是最基礎最傻瓜的,莫笑。
1 計算機基礎
計算機,也就是電腦,你天天用這個東西,他整天干嘛呢??
答:他在跑程式。
CPU是執行程式的電子器件,他執行人寫的程式,來完成各種各樣的工作。程式是啥呢??程式可以通常理解為一系列的執行指令。這些指令是你寫的,電腦按照你的指示完成工作。C語言就是這樣的一種程式,你用C語言寫出的程式的原始檔(通常以.c結尾)。通過某種計算機程式的處理(這個東西叫做編譯器,你可以不理解他是幹啥的,但你至少得會用)生成可執行檔案,然後可以在電腦上執行。所以通常哈,用C語言寫程式的過程就是:
1 寫源程式
2 通過編譯器編譯生成可執行檔案
3 執行,看看你寫的程式是否正確
第三步也稱作除錯程式。你自己通過各種去測試你的程式有沒有錯誤。最簡單的方法是執行它,然後看它是不是和你想象一樣去工作。
所以你如果想學會C語言,必須會寫程式,會用編譯器,然後會除錯。
除錯這個我們以後再講吧。這是一個長期積累起來的經驗,關於如何快速除錯。
記憶體,硬碟,鍵盤,顯示器,cpu,是你寫C語言程式必須接觸的幾個電腦硬體,接下來一一介紹這些硬體。
記憶體和硬碟都是儲存東西的,他們的區別在哪呢??
你的筆記本里有硬碟也有記憶體。一般記憶體是幾G,1G到4G。硬碟是幾十G到幾百G。硬碟是用來長效儲存,電腦斷電後硬碟資料不會丟失;而記憶體是暫時儲存,電腦一斷電,記憶體資料就沒了。所以一般你存東西都是在硬碟裡的,這會佔用硬碟空間。
那麼記憶體有啥用呢???是這樣哈,硬碟存取速度比較慢,而記憶體存取速度快,所以在電腦程式中,一般打交道的是記憶體。因為你要完成某種計算任務,並不需要在電腦斷電以後這些資料還在。比如你想做一個計算器,加減乘除,算完你看到結果就好了,不需要長期儲存。這些資料都是存在記憶體裡的。
所以電腦程式大部分時候都在和記憶體打交道,C語言程式也是。
那麼記憶體和硬碟瞭解了,cpu、鍵盤和顯示器是幹嘛的捏。
cpu就是執行運算,你寫程式反倒不用關心。
顯示器顯示你程式的結果,和你的輸入。
鍵盤用來輸入。
基本上你要考二級,就涉及這麼多了。有時候會讓你讀檔案寫檔案,那麼這就是在操作硬碟了,記住一點就是檔案儲存在硬碟裡。
2 C語言基礎
C語言,它是所有現代流行語言的鼻祖。要想學習它,必須瞭解它的一些基本概念:
變數
變數型別
變數定義
運算子
順序執行
條件執行(if else)
迴圈執行(for、 while)
函式
陣列
結構
指標
變數
變數,就是記憶體空間中的一部分割槽域,儲存你運算中需要的資料。你可以讀取它,可以往裡面寫資料,也可以對他進行運算。所以變數可能是最重要也最基礎的概念,它和記憶體緊緊相連。只不過你剛剛開始學習寫程式不需要總想著記憶體。
那變數有幾個要素呢??
答:變數型別,變數名稱。
變數型別可以表示其操作,這個變數的行為,佔用記憶體的大小。而變數名稱用於區分變數,並對它進行操作,引用。
比如:
int a;
這是一個整數型的變數,名叫a。
變數的型別決定了你能對它的操作以及操作的行為。比如int就是整形,可以有正負int是英文integer的縮寫。unsigned int是無符號整數型別,0和正整數。float是所謂的浮點數,你可以理解為小數。
不同型別的變數,同樣的操作可能會有不同的行為。比如一個a-b。
對於整形的a和b,它的結果是一個整數。
對於無符號整數也就是正整數的a和b,它的結果是一個無符號整數,但也有可能是一個非法的值,因為如果b大於a的話,結果可能就是無意義的了。
至於浮點數依次類推。
總之計算機運算的一個宗旨就是,運算數是什麼型別,運算結果就是什麼型別。如果出現兩個運算型別不一樣或者你給的運算數和運算子的要求的型別不一樣,計算機會給你做轉換。
運算子
剛剛講到運算了,就可以到下一話題了,就是運算子。變數是一個基礎的概念,運算子也是。計算機整天在做的就是運算,運算子是你表示這些運算的標誌。
運算子主要包括兩種,算數運算和邏輯運算。至於位運算,不知道考不考,再說吧,這裡先講前兩種。
算術運算就是加減乘除取餘數,分別對應標誌 + - * / %。%是取餘數,不是除,除是/。
這裡要說明的一點是,計算機的運算和現實世界的運算有一定出入。對於小數,也就是浮點數float,它的算術運算行為比較正常。而對於整形,它的算數運算比較奇怪。整數的除法不整除,只會取結果的整數部分,即商,比如7 / 2結果是3。至於溢位和浮點數的計算誤差什麼的就略顯高深了。
除開算數運算還有邏輯運算。就是與(&&)、或(||)、非(!)。
基本上就是真假值的運算,這個在條件判斷裡面會用到。
判斷與迴圈
由於計算機程式都是順序執行的,從某一個入口處往下執行直到某個結束處,這個入口叫main函式,結束為main函式的結尾。
既然順序執行,可不可以改變它的執行順序呢?答案是可以的,通過條件判斷語句和迴圈語句。
條件判斷的大體是。
if ( ... )
{ ... }
else
{ ... }
基本就是說,判斷一條件,如果為真,執行後面的語句,否則執行else後面的語句。
if可以進行巢狀,組成
if ( ... )
{ ... }
else if ( ... )
{ ... }
else if ( ... )
{ ... }
...
else
{ ... }
接下來講迴圈。可以說,沒有迴圈,就沒有計算機程式。其重要性不言而喻。
迴圈就是說,反覆執行某一段程式,直到某個條件滿足,跳出這個迴圈。在c語言裡主要有for迴圈和while迴圈,for用得比較多,但while比較基礎。他們之間可以互相轉化,但在大多數場合,for比較方便。
陣列,結構,指標
陣列是一段連續的記憶體的變數,用有多個某種型別的元素。
比如剛剛宣告的
int a;
它是一個變數,只佔用一段記憶體。如果宣告一個陣列,就可以宣告很多個int型的變數。陣列宣告用
int a[10]
這樣的語法,表示宣告一個有十個元素的整數型陣列。
然後是結構。
結構是複雜資料型別,一般是struct關鍵字宣告,基本上是很多簡單資料型別(也就是整形浮點型什麼的)組成的。
至於指標呢,是一種特殊的變數型別。它裡面儲存的值是一個記憶體地址,這個記憶體地址所在的記憶體可能儲存著某種其他資料。指標是比較難的,初學不用學得很明白,能會用能過考試就好。
函式
函式是程式執行單位,但比語句高一層。語句是執行最基礎單位,而語句組成了函式
一般來講,程式從一個函式開始執行。對於c語言程式,所有程式的起點是所謂的main函式。而在某個函式之內,可以呼叫其他函式。這樣,函式作為一個功能的單位,完成不同的功能,組合在一起,就成為了一個比較大的功能,完成複雜的計算。
函式需要定義和呼叫。