Pascal 程式設計/變數和常量
與所有程式語言一樣,Pascal 提供了一些修改記憶體的方法。這個概念被稱為變數。變數是命名的記憶體塊。你可以用它們來儲存你無法預測的資料。
另一方面,常量是命名的資料塊。你不能在執行時修改它們,但它們是硬編碼到已編譯的可執行程式中的。常量不一定佔用任何專用的唯一記憶體空間,但有助於編寫乾淨且易於理解的原始碼。
在 Pascal 中,在你甚至被允許使用任何變數或常量之前,你必須宣告它們,就像 Pascal 中幾乎所有符號一樣。宣告使某個符號對編譯器已知,並可能指示它為其有效使用做必要的準備,這意味著——在變數的上下文中——為某個記憶體塊預留一些空間。
宣告始終是一個二元組 ,更具體地說,變數的宣告方式為 ,而常量的宣告方式為 元組。元組是有序集合。你不能在不使元組變為不同的情況下反轉或重新排列其專案。
| 在你宣告一個識別符號來表示一個事物後,你不能重新宣告同一個識別符號來表示另一個(或同一個)事物(“陰影”可能適用,但稍後會詳細介紹)。 |
識別符號是表示常量、型別、邊界、變數、過程和函式的名稱。它們必須以字母開頭,後面可以跟任何組合和數字的字母和數字。識別符號的拼寫對其整個長度都具有重要意義。對應的大寫字母和小寫字母被認為是等效的。[1]
字母指的是現代拉丁字母,即你在書寫英語單詞時使用的所有字母,而數字是西阿拉伯數字。
正如你從引言的最後一句話中推斷出的那樣,字母的大小寫無關緊要:Foo 和 fOO 都是同一個識別符號,只是表示方式不同。
識別符號的使用很簡單,只需在合適的位置寫出來即可。
在 Pascal 開發的時代,計算機記憶體是一種寶貴的資源。然而,為了構建一個有效的編譯器,引入了重要字元的概念。識別符號的重要字元是區分兩個識別符號的字元。
一些程式語言有 8(八)個字元的限制。這導致了非常神秘的識別符號。然而,如今,重要字元的限制主要受可用性的影響:程式設計師最終必須自己輸入這些字元,除非 IDE 支援某種自動完成功能。例如,FPC 的限制是 127 個字元
識別符號包含
1到127個重要字元(字母、數字和下劃線字元),其中第一個必須是字母(a‑z或A‑Z),或下劃線(_)。[2]
| 你仍然可以編寫長度超過 127 個字元的識別符號,但是,編譯器只檢視前 127 個字元,並丟棄其餘字元,因為它們與編譯器無關。 |
請注意,允許使用 _ 也是 ISO 10206(“擴充套件 Pascal”)的擴充套件,但是——與 FPC 不同——它規定識別符號既不能以下劃線開頭也不能以下劃線結尾,也不允許兩個下劃線彼此相鄰。
變數是在專用部分中宣告的,即 var 部分。
program varDemo(input, output);
var
number: integer;
begin
write('Enter a number: ');
readLn(number);
writeLn('Great choice! ', number, ' is awesome.');
end.
當編譯器處理 var 部分時,它將為其關聯的資料型別分配儘可能多的記憶體。在這裡,我們指示編譯器為一個 integer 預留空間。一個 integer 是一種程式語言的一部分的資料型別,因此,無論使用哪個編譯器,它都保證存在。它儲存 ℤ 的一個子集,即整數集,例如 42、1337 或 -1。
資料型別指的是允許的值範圍和對該範圍的值的允許操作的組合。Pascal 將一些基本資料型別定義為語言的一部分。除了 integer 之外,還有
char- 一個字元,比如拉丁字母或西阿拉伯數字,但也包括空格和其他字元。
real- ℚ 的一個子集,即由於計算機的二進位制性質,有理數的集合。例如
0.015625(2−6) 或73728.5(216 + 213 + 2−1)。 布林值- 布林值,即
false或true。
每個資料型別定義了資料在記憶體中的佈局方式。在諸如 Pascal 之類的更高階語言中,程式設計師無需關心資料的具體儲存方式,但處理器(即在大多數情況下為編譯器)必須定義它。
我們將在後面重新討論所有資料型別。
如您所見,上面的示例包含 readLn(number) 以及程式頭也列出了 input。 ReadLn 將(嘗試)從(可選命名的)源讀取資料並將(解釋的)值儲存到提供的引數中,丟棄所有行尾字元。如果沒有指定源,就像這裡一樣,將假定為 input,因此 readLn(number) 等效於 readLn(input, number),但更短。
當程式執行時,它將停止並等待使用者輸入一個數字,即可以轉換為引數資料型別的字面量。
Enter a number: I want cookies!
./a.out: sign or digit expected (error #552 at 402ac3)
writeLn 沒有執行。現在很明顯 I want cookies! 不是可以轉換為 integer 值(即 number 的資料型別)的字面量。作為參考,此錯誤訊息是使用使用 GPC 編譯的程式生成的。使用不同編譯器編譯的程式可能會發出不同的錯誤訊息。您必須在程式的附帶文件(即使用者手冊)中說明使用者何時何地需要輸入資料。稍後我們將學習如何處理錯誤輸入,但這目前太複雜了。
可以根據需要建立任意數量的 var 部分,但它們不能為空。還有一種用於宣告多個相同型別的變數的簡寫語法
var
foo, bar, x: integer;
這將宣告 *三個* 獨立變數,它們都是 integer 資料型別。但是,*不同* 的型別必須出現在不同的宣告中
var
x: integer;
itIsSunnyInPhiladelphia: Boolean;
program constDemo(output);
const
answer = 42;
begin
writeLn('The answer to the Ultimate Question of ',
'Life, the Universe, and Everything, is: ',
answer);
end.
如引言中所述,常量永遠不會改變其值,但您必須修改原始碼。因此,常量的名稱不能出現在賦值語句的左側。
有一些預定義的常量
maxInt- 這是
integer變數可以假定的最大integer值。沒有 *最小整數* 常量,但保證integer變數至少可以儲存值-maxInt。 maxChar- 同樣,這是
char變數可以假定的最大char值,其中 *最大* 指的是使用內建的ord函式的序數值。 maxReal、minReal和epsReal- 由“擴充套件 Pascal”標準定義。
false和true- 指的是布林值。
Pascal 的設計初衷是為了使它能夠在一遍中從上到下編譯:原因是為了使編譯變得快速簡單。區分變數和常量允許處理器簡單地將常量識別符號的任何出現替換為其值。因此,常量不需要像變數一樣進行特殊處理,但允許程式設計師重用重複出現的資料。
Zähler(意為“計數器”/“列舉器”)構成有效的識別符號嗎?
1direction (1D) 是允許的識別符號嗎?
write 和 writeLn 之間有什麼區別?writeLn 在列印完所有引數後將游標移到下一行。
參考文獻
- ↑ Jensen, Kathleen; Wirth, Niklaus. Pascal – user manual and report (4th revised ed.). doi:10.1007/978-1-4612-4450-9. ISBN 978-0-387-97649-5.
{{cite book}}: no-break space character in|title=at position 7 (help) - ↑ Michaël Van Canneyt (2017年9月). "§1.4". Free Pascal 參考手冊. version 3.0.4. p. 15. ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf. 檢索於 2019-12-14.