[程式設計的壹貳參肆] 程式語言的基礎知識(I) — 變數及運算式

Phoebe Huang
9 min readJul 5, 2020

--

終於決定了第一個系列文章的方向,原本打算從演算法開始,後來想想,很多人在Facebook都會詢問要學哪種程式語言以及基本的語法,所以我想從程式語言的基礎,也就是所有程式語言都會有的基本概念來寫起,這樣更能夠幫助到初學者

基礎系列的文章主要以C/C++為主,Java為輔來做比較,之後的實作文章應該會以Java為主,如果需要解釋到記憶體部分,懂一些C/C++會比較快理解!當然希望以後有時間的話可以寫一篇文章整理各個程式語言的比較及應用或是寫其他語言的文章~

我們在學習程式語言時,最先一定會碰到幾個基本要素:
1. 變數種類
2. 變數可表示範圍
3. 變數名稱(如何命名)
4. 變數使用範圍區塊(scope)
5. 靜態變數(基本概念)
6. 運算元、運算子組成運算式

電腦(計算機)的運算是由0,1組成的,所有的運算結果我們都必須先存入到一個叫做變數的東西裡面,而在電腦裡的基本變數種類就有十幾個,這些之後還能夠延伸組合成資料結構(在物件導向程式裡也可以做為類別class)作為變數種類,基本的變數種類以及他們在程式中的關鍵字(keyword)有這些:

基本變數種類

布林值只能存放兩種值 — true(1), false(0),佔用程式空間1byte
字元(char)可以用來存放0~255種數值,在讀取ASCII Table內容非常有用處,經常用在通訊封包解析
例如 char test = 65,如果 printf(test),則印出結果為 a
整數在C/C++分為相當多種,這些整數類型主要是以數字範圍大小的不同來做區分;而實數也分為三種,相較於整數類型還包含了浮點數,主要也是以數字範圍大小做為區分

如上一篇《The Performance of Your Algorithm》提到的空間複雜度,這些變數型態你可以想像成在電腦裡面會佔用一些記憶體位置,而他們所佔的空間大小是不一樣的,我們複習一下變數型態的大小:

Different data size in different OS and different programming language

電腦內僅能存在0,1這兩個東西,也就是說一個空間只能放0或1,是以bit(位元)單位,而上圖中的變數大小是以byte(位元組)為單位,一個byte等於8bits,大家可以透過下面的動畫知道bit和byte之間的關係,以及簡單的bit運算原理,bit基本上就是個以2為底的指數加法運算

bit 運算原理

以字元char這個變數型態來說明,由上面的動畫我們可以知道在c/c++中,char這個變數形態佔1byte,所以char可以表示的數字有0~255個,但是可能有人有發現為什麼會有 charunsigned char兩個不一樣的型態呢?

阿~原來因為我們知道數字中有正數又有負數,那電腦怎麼分辨正數與負數呢?靠的就是我們的bits最左邊的位元啦!

所以呢,unsigned char 就是只有正數不分正負,8個bits通通拿來當數字計算,變數範圍為0~255;而char 需要分正負,也就是犧牲最左邊的位元拿來當符號,0是正數,1是負數,因此數字部份就只有7個bits,變數範圍為-128~127

大家可以嘗試推算看看其他的變數種類可以表示的變數範圍是什麼,推算出來的也可以留言分享過程,以下就先整理出變數在C++在64位元的電腦中可表示的範圍,想自己確認的也可以到github直接複製程式來執行唷!

變數在C++在64位元的電腦中可表示的範圍

接下來就說到比較輕鬆學習的變數命名原則以及其他定義變數的keyword囉(很開心😆😆😆😆)~~

在程式中替變數或是函式命名是很重要的,名稱取的好,一眼就能看出含意,所以每次一開始在規劃程式時,我都會花大半時間在思考這些變數及函式要叫什麼名字,因為取得不好,自己之後沒有辦法辨識,其他人也很難閱讀、接手程式,所以與其之後搞混不如在一開始就幫他們取好名字才不會留有後患啊!!

變數命名有以下四個必須遵守的規則(編譯時就會出錯的規則):
1. 不能以關鍵字當作變數名稱
2. 在同一個程式區塊,不能有相同的變數名稱
3. 開頭不能是數字
4. 不能使用特殊符號(Like !, @, #, $, %, ^, &, *)

還有以下打從程式語言(1957)出現到現在,在變數及函式的命名上,程式設計者們也有了一些不言而喻的規則,像是:
5. 變數開頭為小寫字母
6. 幫變數取一個有意義的名字(像是 speed 就是個比 s 更好的名字!)
7. 如果變數名稱需要結合兩個單字,試著使用下底線 “_” 或是單字的開頭為大寫來分開兩個單字 (carspeed 可以把他變成 carSpeed 或是 car_speed)

到這邊基本的知識已經都差不多有了,接下來要說明一下大家常常聽到的全域變數(Globle Variable)區域變數(Local Variable)是什麼呢?!相信讀者應該都看過下面C++ 的主程式 (程式碼),也就是C/C++主程式部分,我多加了幾個變數,接下來會以這段程式來說明程式的區塊性

程式的區塊性 I

說到變數使用區域(scope)會涉及許多層級,可以講到很複雜的class類別、function函式,這邊我們先假設main 這個區塊就是我們的function函式(其實他也算是一個主函式),而整個檔案我們將他看成是一個class類別(我們程式進入的主要檔案)

全域變數 Global Variable: 宣吿在函式以外,類別內的變數,例如 carSpeed區域變數 Local Variable: 宣告在{ }內的變數,為此{ }區域的區域變數,例如 carDriveSecond, carPosition

全域變數基本上就是在函式以外的變數,每個函式都可以共同使用這個變數
而在函式內或是{}大括號括起區域內內的區域變數就只能在區域內使用

用下面這張圖解釋,我先新增了一個函式calculatePosition A,但你會發現無法編譯,這就是因為carPosition和carDriveSecond是 main 的區域變數,無法在別的函式使用,要使用有兩個辦法,一個是將它們放到全域變數的位置,另一個則是將他們當成參數丟進函式裡面,像函式calculatePosition B,結果再return 返回出去!
而carSpeed不管是在main或是在calculatePosition都可以使用,因為他是全域變數

程式的區塊性 II

你也可以新增一個函式calculatePositionWithSpeed多帶一個參數carSpeed,此時雖然他與全域變數變數名稱相同,但是函式參數的作用範圍只在函數裡面,所以編譯時不會出錯,執行程式時也不會互相衝突

程式的區塊性 III

跟變數不同,還有一種keyword 關鍵字需要說明,那就是在C/C++的constconst 代表的是常數(constant),可以放在變數型態 keyword 之前,來表示這個變數的被指定值(value)後就不能再變更,也就是常數,如下圖所示,而在Java 中則是使用final 來作為相同意義的keyword

這邊有非常值得一提的事情,通常被我們定義為常數的名稱,程式設計師又有了不約而同的規定,那就是名稱一定都要是大寫字母,然後單字之間加上下底線,像下圖的carSpeed 就要改成CAR_SPEED

C/C++的常數const關鍵字使用

再來我們講到程式基礎的最後一個要素,也就是運算子跟運算元,我們電腦之所以能做這麼多事情,其實就是因為電腦不斷的在做運算,電腦底層透過1, 0來運算,而寫程式的我們如果也用1, 0來運算的話豈不是要累死了

所以啊~我們可愛的程式語言也有像數學方程式一樣的運算子和運算元:

運算子:+, -, *, /, %, <, >, ≥, ≤, &&, ||, = 這些都是
運算元就是像數字、變數(代數)、字串……

電腦的運算子分為三種:
1. 一元運算子: x++, ++y , ++ 這種可以單獨一個運算元做運算的
2. 二元運算子:a+b , a-b, a≥ b, +, -, ≥ 這是必須有兩個運算元才能做運算的
3. 三元運算子:a ? b:c, 程式語言的特殊判斷運算子,如果a為true,則結果是b,如果a為false,則結果是c

下面就整理出大部分程式語言都會有的運算子以及使用方式,不過有些近十年二十年出現的程式語言會有些不同也會有自己的特殊的運算子寫法,就給大家去探索拉!

程式語言的運算子用法

以上整理出一些程式語法的基礎,有了這些預備知識,下一篇文章預計會介紹程式的迴圈、輸入/輸出(I/O)以及教大家如何透過command line 執行c/c++、java、python程式,利用command line 可以不用安裝龐大的IDE,可以順便了解程式編譯的過程,在做伺服器後端程式也是相當有幫助,是我以來一直強迫自己必須學會的技能,也是加快工作效率非常好用的tool!

喜歡我的文章的人也記得幫我按個拍手、分享,覺得很不錯的可以幫我拍個50下!
也要快點追蹤我的 FB粉絲專頁 — 飛比尋常的程式設計世界 ,不會太頻繁出現在你的塗鴉牆騷擾你,好文章生產需要一點時間,有錯誤或想討論的都歡迎留言給我唷!那就下次見拉!

--

--

Phoebe Huang
Phoebe Huang

Written by Phoebe Huang

A software engineer from Taiwan, use free time to learn more about computer science.

No responses yet