iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
Software Development

程式基礎概念討論系列 第 4

[DAY 4] 讓我們可以帶著資料走的變數

  • 分享至 

  • xImage
  •  

在昨天我們了解了程式中資料的不同型態,今天就讓我們來討論一下如何在程式中使用資料吧~

要在程式中使用資料是很簡單的,只要直接輸入到程式的指令中就可以了,像是 Hello World 教學範例就是把一串值為 Hello World 的文字資料輸入到「把資料顯示在電腦營幕上」的指令中。
[Python]

print("Hello World") # 接收了 Hello World 資料的 print 指令
^指令    ^資料

可是,我們都知道程式是由一連串的指令所組成,而這些指令是互相獨立的,假如我們把一個資料輸入到指令 A 中的話,其他指令是無法存取到這個輸入進指令 A 中的資料的。
[Python]

print("Hello World") # 接收了 Hello World 資料的 print 指令
print() # 第二個 print 指令,可是它沒有接收到前面的 Hello World 資料!

難道我們需要在每一個指令中都輸入資料嗎?這也太不方便了,而且這樣程式根本沒辦法好好的做事,例如我們使用程式進行了運算的指令,我們還是沒辦法在另一個指令中存取前面運算的結果。因此,我們需要一個方法把資料從指令 A 帶到其他指令中使用,而這個方法就是為資料準備一個容器,也就是變數

宣告變數

就像是在現實的生活中我們需要使用不同的容器來放置不同的物品,我們也需要根據不同的資料型態為它們準備不同類型的變數。而宣告變數就是我們要告訴程式我們要準備什麼資料型態的變數的指令,需要注意的是,對於大多數的程式語言來說,一旦我們在宣告中指定了這個變數的資料型態後便不能改變,也就是說,我們不能把其他資料型態的資料輸入到這個變數中,只能使用這個變數來儲存它被指定的資料型態的資料。

以下是使用 C# 宣告變數的例子:

int x; // 宣告變數 x:讓程式準備一個 int 資料型態的變數
x = 10; // 把 int 資料 10 儲存到變數 x 中
Console.WriteLine(x); // 這次指令便成功的從變數 x 中讀取到儲存好的 int 資料,顯示結果:10
x = "Hello"; // 錯誤! 我們不能把 string 資料 Hello 輸入到 int 變數 x 中

不指定資料型態的隱含型別

有趣的是,雖然宣告變數是為了讓程式準備某一個資料型態的容器,並不是所有的程式語言都會要我們在宣告變數的時候就要指定它的資料型態,有些語言,如 C#,會允許我們在不指定資料型態下宣告變數,這種宣告方式的變數會被稱為隱含型別(Implicitly Typed)。那程式是怎麼知道這個變數的資料型態是什麼呢?因此我們需要在宣告變數的同時把資料輸入到變數中,讓程式的運行到宣告變數時可以透過辨識我們輸入的資料的資料型態來指定變數的資料型態。

雖然這樣的做法看似繞了一個圈去做跟一般的宣告變數一模一樣的事,但由於變數的資料型態的指定會從程式碼中指定改變為在程式執行時才指定,我們可以不用在編寫程式碼時便指定該變數的資料型態是什麼。舉例來說,在程式設計中,有一種處理及傳遞資料的方式名為函式(Function/Method),我們透過呼叫一些函式來獲取一些資料,當我們不肯定這個函式會給我們什麼資料時,隱含型別的變數宣告方式就會非常有用了。不過,對於大多數的程式語言來說,隱含型別的宣告跟一般的宣告一樣,一旦這個變數被指定了資料型態後便沒辦法改變。

以下是使用 C# 宣告隱含型別的變數的例子:

var x = someUnknownFunction();
// 宣告變數 x,然後等待執行完函式 someUnknownFunction() 獲取到資料後再把資料輸入到變數 x 中並根據獲取的資料來指定變數 x 的資料型態

可以隨意改變資料型態的動態型別

在上文中,我們曾提到對於大多數的程式語言來說,一旦變數被指定了資料型態後便無法更改,這些不能改變資料型態的變數被稱為靜態型別。不過,還是有一些程式語言會允許我們在指定變數的資料型態後透過改變自身的資料型態來接收其他資料型態的資料,這類型的變數被稱為動態型別

以下是使用 Python 宣告動態型別的變數的例子:

x = 10 # 宣告變數 x 並輸入 int 資料 10,這時侯變數 x 的資料型態為 int
print(x) # 顯示結果:10
x = "Hello" # 把 string 資料 Hello 輸入到變數 x 中,這時侯變數 x 的資料型態改變為 string
print(x) # 顯示結果:Hello

雖然動態型別的變數有著不會限制資料型態,讓我們可以在程式中更彈性的修改及接收不同類型的資料的優點,但同時也正因為它沒有資料型態的限制,在一些比較複雜的程式中,當我們反複的使用該變數時,有時候會因為變數的資料型態在程式執行過程中有所改變而無法肯定它在某一段的程式中時是屬於什麼資料型態。這個狀況便有機會導致我們在處理變數時因為使用了錯誤的資料型態而出現非預期的 Bug,而可怕的是,這時候程式有可能會因為動態型別的特性而順利的執行,卻給了我們一個錯誤的結果。但由於程式是順利執行的,我們便可能忽略了這個 Bug 或是會讓尋找程式中錯誤的地方的過程變得困難。

不能改變數值的常數

在編寫程式的過程中,有時候我們會希望有一些資料儲存在程式中一直不會改變,例如在設計計算圓型的圓周及面積時,我們會希望能把反複被使用的圓周率儲存起來隨時使用。可是,使用變數把那資料儲存起來的話,我們便只能自行注意不要在程式中不小心改動到該資料。因此,為了解決這個問題,有些程式語言便提供了我們常數 (constant)。常數是指不能被改變值的變數,唯一能改變常數的值的時間點便是在宣告它的時候,因此這過稱也被稱為定義常數

以下是使用 C# 定義常數的例子:

public const float pi = 3.14; // 宣告 float 常數 pi 並指定它的值為 3.14

上一篇
[DAY 3] 程式中不起眼卻很重要的角色 - 資料與資料型態
下一篇
[DAY 5] 讓程式開始做事的運算式 (上)
系列文
程式基礎概念討論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言