從零開始學C語言

2022-02-22 10:58:17 字數 3078 閱讀 2102

從零開始學c語言

@閬苑祁寒

更新說明:此版本是最終版本。初始版本有關helloworld的內容調到了附錄部分。

寫在前面:本文從乙個初學者的角度,給出了對c語言的簡單理解。最近一次更新調整了之前的敘述方式。

目錄part1

從hello world講起

part2

知識結構梳理

part3

一路走來的習題

part4

實踐心得和疑難釋義

part5

結束語part6

附錄如有謬誤,敬請指出!

part1從hello world講起

「c語言是一門計算機語言。」這表明:

(1)c語言是源於計算機的,通過c語言,可以接觸到計算機的某些工作原理。

(2)c語言是一門語言,既有和漢語和英語等語言相似的特性,也有語言所必須的語法結構。

(3)c語言是計算機語言,可唯一解釋性使得c語言有別於其他語言,反之,只要掌握了每乙個語句的原理,很容易學好計算機語言。

簡單了解eniac後,認識到其架構是具有時代侷限性的,其程式和資料儲存是分開的,資料通過類似於**接線局的接線方式來連線對應的程式。這是相當麻煩的,以至於從事曼哈頓計畫的馮·諾依曼,改進了計算機的架構,將程式和資料放在一起,這也是馮·諾依曼被公認為計算機之父的原因。相反,現代**都是程式控制接線,這表明技術的發展也永遠並不是單一領域的。

但是,這樣的簡化並不能適應大規模的運算。眾所周知,計算機資料和程式的儲存方式是二進位制**,用1和0分別代表數位電路中的開和關,也即布林代數中真(true)和假(false),乙個二進位制位稱為1 bit(位元),通常將8個二進位制位稱為1 byte(位元組),在記憶體作為乙個儲存空間。根據數理邏輯運算定義加和乘,就完成了傳統計算機體系的構建。

必須指出,我們公認的計算機編碼表ascii表(american standard code for information interchange)就恰好有128=28個特殊字元(後被擴充到256個特殊字元),依次從0編號到127,對應1位元組長度的二進位制數字的十進位制大小。

儘管將計算機架構中的資料儲存和程式放在一起,已經大大提高了計算機的效率。但對於程式本身而言,常常會出現一行固定指令被重複使用多次的情形。因此考慮將其提煉為機器語言(組合語言),進而再一次提高了計算機的效率。進一步,將重複出現的機器語言再一次提煉,就得到了高階語言。

第一門高階語言c語言,具有劃時代的意義,它連線了計算機組成(硬體)和電腦程式(軟體),這對於入門計算機學科是極好的。

不可否認,c語言並非十全十美。一方面,面向過程的靈活性(指標)常常會因為小小的錯誤而使整個程式乃至計算機崩潰(早期計算機記憶體並未設定程式與作業系統,以及不同程式之間的界限)。另一方面,儘管在函式和巨集中初步體現了大規模程式開發的模組化思想和封裝思想,但是例如c語言的函式不可互相巢狀等缺陷使得靈活性下降。除此之外,作為語言本身先於語法而出現的特性,決定了基於c語言的計算機語言的語法結構,在發展中必然是逐漸完善的。c語言一些看似不符合常理的語句,它們的出現就好解釋了。

區域性來說,針對不同的目的,新出現的計算機語言在c語言的基礎上進行各自的改良。但從總體來說,計算機語言逐漸從面向過程到物件導向。程式的封裝,使得計算機程式設計師只需要查閱參考手冊相關包的使用說明,如無必要,不再去關注內部封裝的演算法本身,這也是作為工程學科的乙個重要特點。這些後續發展而來的語言也就因此被稱為物件導向的語言。

最後,包括c語言在內的諸多計算機語言,第一課與其說是認識計算機語言,不如說是認識最基本的語句hello world裡的所包含的全部資訊及相關附錄!在此之前,你的手頭應該擁有一本c語言的教材,下面將一本講得非常明晰的教材推薦給大家:

《c語言程式設計教程》·姜恒遠·高等教育出版社

以下便是c語言的hollow world程式(不止一種寫法,但它是最為經典的):

#include < stdio.h>

int main(void)

最初拿到這個程式時,除了幾個類似於英文單詞的記號,其餘的內容,就像初學一門新的課程一樣,其實大腦是一片空白的。也許好奇心驅使你稍稍改動這個程式,但更多的還是受改動範圍的侷限和因為報錯而沮喪罷了。

下面對這個最基本的程式涉及到的基本語法列出如下:

☆   #include將標準輸入輸出的標頭檔案,在編譯時載入到源**的頭部。

☆   int main(void)  函式頭的宣告形式,宣告了乙個名為main的函式,返回值型別是int型別,形式引數是void空型別。需要指出,main函式是c語言的主函式,有且僅有乙個。一方面,編譯過程總是從主函式開始,再根據呼叫關係讀取其他的函式;另一方面,同名的函式會造成編譯衝突。

☆   {}  表示復合語句,常用在迴圈結構和函式體中,如果沒有花括號,c語言預設只逐級向下讀取一行,其餘內容作為花括號(如果有)中的最大層級解釋。需要注意,c語言不像python,會受到縮排的影響,反過來,有乙個標準的程式設計規範,對於c語言的學習相當重要。

☆   printf("hello, world! /n");  呼叫了標頭檔案中的printf函式,輸出字串常量,』\n』作為轉義字元表示換行。

☆   return 0;  函式返回值,相當於右花括號的作用,用於結束對應型別的函式。事實上,int型別的主函式有無返回值,對於編譯成功與否沒有影響。嚴格來說,對應資料型別的函式,必須要有對應資料型別的返回值。在初學時需要注意,返回值並不是輸出在螢幕上的值,而是函式本身有了乙個值,也就是如果在另乙個函式(主調函式)中呼叫這個函式(被調函式),這個函式的返回值可以賦給乙個變數或者輸出。

紅色字型的部分可以參考「函式」和「結構化程式設計」章節的內容,高亮字型的部分可以參考「資料結構」章節的內容,紫色字型的部分可以參考「基本運算和輸入輸出」章節的內容。

更多細節部分,可以參考主流c語言參考書自行補充完整。需要指出,ascii表、優先順序與結合級表、輸入輸出函式轉換說明符表和常用轉義字元表,是初學c語言時最為重要的四個表,應該作為工具經常使用。

其餘更深入的內容,在學到對應的知識後將一目了然。此時,就沒有必要去盲目補充了,與其沉溺於起點寸步不前,不如走向遠方,等學有所成時再回頭看起點,將恍然明悟,且獲益匪淺!

part2 知識結構梳理

從零開始學C語言(2)

變數定義 格式 資料型別 變數名 如 int price int amount 注意 變數的定義是一條語句,每條語句都是以分號結尾的。故定義完變數,後面不要漏掉 分號 資料型別 表示想要儲存什麼型別的資料就定義什麼型別的變數 如 儲存整數用 int 型 儲存小數用 float 或者 double 型...

2019 10 14從零開始學C

環境 visual studio 2019 開始第乙個c 新建專案 新建項 f5執行 1 標頭檔案 include用於申明iostream類中的函式和外部資料,iostream包自動定義乙個名為count的變數 物件 它接受所有與標準輸出繫結的資料。操作符 將資料傳送到標準輸出 c 允許操作符過載 ...

從零開始學C 介面

這一章的內容比較難,學這個的前提是你已經掌握了c 的基本語法,了解什麼是繼承,什麼是物件導向。有了這個之後,我會盡量用最簡單通俗的語言去梳理整個知識,衝衝衝 假設我們現在有乙個u盤類,mp4類,class mp4 class udisk 這是我們宣告乙個usb插口類 規定實現介面的類必須實現對應的函...