位元詩人 [Pascal] 程式設計教學:宣告和使用變數 (Variable)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

在程式語言中,變數是指向資料的標籤。本文介紹在 Pascal 中宣告和使用變數的方式。

變數的要素

變數具有以下要素:

  • 識別字 (identifier)
  • 資料型態 (data type)
  • 值 (value)

我們以實例來看如何宣告和使用變數:

{$ifdef FPC} {$mode DELPHIUNICODE} {$endif}

{$ifdef WINDOWS} {$apptype CONSOLE} {$endif}

Program Main;

Var
  message : String;

Begin
  message := 'Hello World';

  WriteLn(message);
End.

我們宣告了變數 message,該變數的資料型態是 String,值是 'Hello World' (字串)。

我們在宣告變數時,其實是在程式中建立新的識別字。以本例來說,message 原本在 Pascal 程式中是沒有意義的,經過宣告後才變成變數。從電腦程式的角度來看,當我們宣告變數時,電腦程式會根據該變數的資料型態自動配置足夠的記憶體來用。

在 Pascal 中,刻意用 := 來賦值,這是為了和 = (相等) 區分。大部分的程式語言是以 = 做為賦值,以 == 做為相等。但 Pascal 家族語言刻意用不同的符號來區分,較易辨識。

再來看另外一個例子:

{$ifdef FPC} {$mode DELPHIUNICODE} {$endif}

{$ifdef WINDOWS} {$apptype CONSOLE} {$endif}

Program Main;

Var
  a : Integer;
  b : Integer;

Begin
  a := 3;
  b := 4;

  WriteLn(a + b);
End.

在這個例子中,宣告了兩個變數 ab,兩者的資料型態皆為 Integer,其值分別為 34

宣告變數的地方可以改寫如下:

Var
  a, b : Integer;

這種寫法比較適合在短變數或局部變數上。

宣告常數 (Constant)

常數是在程式中不會修改值的識別字。以下 Pascal 片段宣告兩個在數理上常用的常數:

Const
  E = 2.718281828
  PI = 3.141592654

對程式設計者來說,宣告常數的用意在於預防不當修改。編譯器在編譯程式碼時會檢查常數是否遭到修改。在常數遭到不常修改時引發錯誤以提醒程式設計者。

從軟體工程的角度來說,使用變數或常數會比直接寫死實字來得更有意義。例如:以下的 Pascal 片段用來記算圓面積 (area of circle):

area := 3.14159 * 10.0 * 10.0;

雖然我們可以透過 3.14159 猜到是圓面積,改寫成這樣會更清楚:

area := PI * radius * radius;

日後要修改 PIradius 時,只要修改變數及常數即可,不用逐行修改實字。

在軟工的觀點上,要減少程式中出現實字的次數。因為程式碼中的實字不具有領域知識。此外,若要修改實字,得逐行修改。比較好的方式是用變數或常數來取代實字。

命名變數名稱

在 Pascal 程式中命名變數的規則如下:

  • 首字為英文字母 (letter)
  • 第二個 (含) 以後的字為英文字母、數字 (number)、底線 (underscore)
  • Pascal 的變數不區分大小寫

根據上述規則發展出命名識別字的風格如下:

  • PascalCase
  • camelCase
  • snake_case (不建議使用)
  • ALL_UPPERCASE (僅用於常數)

由於 Pascal 程式碼不區分大小寫,所以 PascalCasecamelCase 風格的變數實際上視為同一個變數。在 Pascal 社群中使用 PascalCase 的程式設計者較多。

至於 snake_case 是從 C 語言傳來的命名風格,在 Pascal 程式中較少用。ALL_UPPERCASE 在慣例上只用來命名常數。

在命名變數時,可參考以下建議:

  • 使用領域知識 (domain knowledge) 來命名一般變數
  • 使用短變數來命名局部變數
  • 使用 ijk 來命名迴圈的計數器

在命名變數時,建議用領域知識來命名變數。例如,以下的 Pascal 片段用來用來計算複利的本利和:

amount := principal * (1.0 + rate) ** period;

即使不加上註解,我們也可以從這段程式碼所用的變數看出該指令的目的。

關於作者

位元詩人 (ByteBard) 是資訊領域碩士,喜歡用開源技術來解決各式各樣的問題。這類技術跨平台、重用性高、技術生命長。

除了開源技術以外,位元詩人喜歡日本料理和黑咖啡,會一些日文,有時會自助旅行。

近期在學習韓文,並將語言學習的心得轉化為開源專案,回饋社群。

這裡是位元詩人的 GitHub 個人頁