440 likes | 663 Views
第二章 基本語法. 本章將介紹一些程式語言的基本語法,例如識別字的命名、資料型態、運算子及運算式等 。 2-1 識別字 2-2 資料型態 2-3 運算子 2-4 敘述與運算式. 2- 1 識別字. 本單元介紹什麼是保留字、管制字及識別字。. 保留字 (Keywords). 保留字是任一程式語言已事先賦予某一字串一個特別意義,所以程式設計者不得再重複賦予不同的用途。 例如 if 已被賦予決策敘述,程式設計者當然不得再定義 if 為另外的用途,以下是 Delphi 的保留字。 and downto in or string
E N D
第二章 基本語法 本章將介紹一些程式語言的基本語法,例如識別字的命名、資料型態、運算子及運算式等。 • 2-1 識別字 • 2-2 資料型態 • 2-3 運算子 • 2-4 敘述與運算式
2-1識別字 本單元介紹什麼是保留字、管制字及識別字。
保留字(Keywords) 保留字是任一程式語言已事先賦予某一字串一個特別意義,所以程式設計者不得再重複賦予不同的用途。 例如 if 已被賦予決策敘述,程式設計者當然不得再定義 if 為另外的用途,以下是Delphi的保留字。 • and downto in or string • array else inherited out then • as end initialization packed threadvar • asm except inline procedure to • begin exports interface program try • case file is property type • class finalization label raise unit • const finally library record until • constructor for mod repeat uses • destructor function nil resourcestring var • dispinterface goto not set while • div if object shl with • do implementation of shr xor
管制字(Directives) 以下是Delphi的管制字,因為它在某些地方有特別意義,所以請儘量不要宣告其為識別字,以免發生不必要的錯誤 • absolute dynamic message private resident • abstract export name protected safecall • assembler external near public stdcall • automated far nodefault published stored • cdecl forward overload read varargs • contains implements override readonly virtual • default index package register write • deprecated library pascal reintroduce writeonly • dispid local platform requires
識別字(Identifier) • 真實的世界裏,每個人、事及物都有一個名稱,程式設計亦不例外,於程式設計時我們必須為每一個變數、常數、方法、函式、程序、類別、物件及套件(Package)命名,以上所有變數、常數、方法等名稱,統稱為程式語言的識別字。 Dephi的識別字命名規則如下:
1.識別字必須是以字母(大小寫的A至Z)或底線(_)開頭。1.識別字必須是以字母(大小寫的A至Z)或底線(_)開頭。 例如,以下是一些合法的識別字。 a ablOut ediIn -bb 以下則是一些非法的識別字。 7eleven //不能由數字開頭 +c //不能由+號開頭 =c //不能由=等開頭 • 2. 識別字由字母開頭後,可由字母、數字組合而成,但不得包含空白。 例如,以下則是一些合法的識別字。 a8 bb255 b2c3 以下則是一些非法的識別字。 Age#3 //不得使用字母、數字、錢字號及底線外的字元。 c+3 //不得含有運算字。 c 3 //不得含有空白。
3.識別字的長度不限,但Delphi僅能辨識前255個字元。3.識別字的長度不限,但Delphi僅能辨識前255個字元。 • 4. 識別字的大小寫均視為相同,例如Score、score及 SCORE皆代表相同的識別字。 • 5. 識別字不得使用保留字,如if、for等。 • 6. 識別字要用有意義的單字,例如StudentNumber 或AverageIncome。除非生命週期極短的變數才用 x、i或a等當識別字,也千萬不要用k23erp等這種沒意義又難記的識別字。 • 7. 識別字有多個單字時,中間可以加上底線(_),例如上例的StudentNumber可寫成 Student_Number,若擔心打字不靈光亦可寫成Stu_Num、stu_num、StuNum或stunum,其中 StuNum又稱為駱駝表示法,因為大寫字母看起來像駝峰一樣,可以避免鍵入底線的困擾、且提昇閱讀效率。
2-2 資料型態 • 資料的表示 電腦的主要工作就是處理資料,Delphi所能處理的資料為整數、浮點數、布林值、字元與字串。 分別說明如下:
整數 Delphi可以處理的整數有兩種進位方式,分別是十進位與十六進位。十進位的表示方式同我們平常的書寫方式,如 25;十六進位的表示方式為在數字的前面加上錢字號($),例如$12則為十進位的18。
浮點數 數字中含有小數點或指數的稱為浮點數。以指數為例,E或e表示10的次方,如0.0023、2.3E及2.3e-3均是表示相同的浮點數。
布林值 使用True與False可以表示布林值。
字元與字串 • 字元與字串一律使用單引號將欲表示的字元與字串兩邊括起,以下式子分別是字元與字串的表示方式。 'a'//字元 'Office XP快樂上手' //字串 • 若要使用控制字元,則應使用井字號(#)。例如,以下式子可讓Line1與Line2之間跳行與歸位。 'Line1'#13#10'Line2'
資料型態 Delphi所能處理的資料如上所述,接下來要討論的是電腦應如何儲存以上資料。因為不同性質的資料所需要的記憶體空間均不同,而Delphi為了有效地使用記憶體儲存資料,於是規劃了以下的資料型態,也就是讓小東西用小箱子裝、大東西用大箱子裝的道理,如此才能更有效率地儲存與搬運。
Delphi的資料型態規劃如下,首先將資料分為六大類,Delphi的資料型態規劃如下,首先將資料分為六大類, 分別是Simple、String、Structured、Pointer、Procedural及Variant simple ordinal integer character Boolean enumerated subrange real string structured set array record file class class reference interface pointer procedural variant
Simple Simple亦是資料型態的分類,它代表所有的數值型態。Simple亦可再分為Ordinal(序數)與Real(實數)型態。Ordinal代表一種可以區分數值前後次序的型態,例如Integer、Character、Boolean、Enumerated及Subrange等均稱為Ordinal型態。 只要是Ordinal型態的變數,均可套用7-4節的序數函式。
Subrange型態 有些變數若有其一定的範圍,則可使用Subrange型態。例如某一個變數欲儲存學生的考試成績,可以宣告一個Subrange型態如下,其型態名稱為Tnumber。往後,Tnumber的用法就如同Real或Integer。 type Tnumber = 0..100;
Real型態 Delphi可用的Real型態如下表,其中打星號(*)者稱為Generic,具有較佳的執行速度,其餘的稱為Fundamental。
Boolean型態 若某一個變數的值僅有True與False,則可使用Boolean型態。Delphi的布林型態如下表所示,星號(*)表最佳的選擇,其它的是為配合不同作業系統或相容性等問題而產生的型態。
Enumerated型態 • 有些變數的資料若可簡單的列舉,可使用 Enumerated 型態。其使用方式為先使用type列舉其可能值,例如12-3節的TmouseButton定義如下,其使用方法請看範例12-3a。 type TmouseButton = (mbLeft, mbRight, mbMiddle); • 或者亦可自行定義以下列舉型態,此型態的名稱為TmyColor。 type TmyColor =(Red, Yellow, Green, White);
Integer型態 Integer的資料型態如下表所示,其中打星號(*)者稱為Generic,具有較佳的執行效率,其餘則稱為Fundamental。
Characer型態 Characer的資料型態如下表所示,其中打星號(*)者稱為Generic,有較佳的執行效率,其餘的稱為 Fundamenal。
Sring型態 Delphi可用的Sring型態如下表所示,打星號(*)的Sring是系統建議採用的型態,編譯器會依據字串的長度而自動採用ShorSring或AnsiSring。
變數宣告 變數的功能是用來輸入、處理及儲存外界的資料,而變數在使用以前均要於保留字var之後宣告,才可使用。在一些舊式的Basic語言中,變數並不需要事先宣告,卻也帶來極大的困擾。以下式子即為變數未宣告的結果,編譯器便無法回應使用者在拼字上的錯誤,而造成除錯上的困難。 student :=studend+1 上式若事先宣告suden如下: var suden : ineger ; 則編譯器遇到sudend時,便會提醒使用者此sudend並未宣告的錯誤訊息,提醒使用者補宣告或注意拼字錯誤。
Delphi的變數宣告語法如下: var 變數名稱1[,變數名稱2] : 變數型態 ; 上式的變數名稱命名同識別字,以下敘述是一些變數的宣告。 var i : Ineger ; j,k : Real ; a : Sring ; 若是全域變數,亦可在變數宣告時直接給予初值各 函數或程序的區域變數則無法宣告時順便給予初值。 var i : Ineger = 10 ; a : Sring = 'Office XP快樂上手';
型態轉換(ypecas) • 不同的資料型態是否可以相互轉換,答案是可以的,但前題必須是它們所佔的記憶體空間是相同的。型態轉換的語法如下: 新型態 := 型態名稱(原型態); 例如以下敘述可將字元型態的c1轉為整數型態的a2。 c1 :='a'; a2 :=Ineger(c1); • 因為整數與變數所表示的數值範圍不同,所以整數與實數是不可互轉的,且因整數可表示的範圍較小,故可直接將整數設定給實數;但如果是實數要轉為整數,則應使用取整數的IN及runc函數,以上函數的語法及用法請看7-1節的數值函數。
常數符號的宣告 • 跟變數一樣,常數符號(以下簡稱常數)亦需要配置記憶體,與變數不同的是,常數符號正如其名稱所示,在整個程式中都不會改變其值,故稱為常數。程式設計中,有兩種表示常數的方式,一種是文字式(Ineral),例如直接以15或3.14159表示某一常數;另一種是本單元要介紹的常數符號式(Symbolic)。 • 之所以含有常數符號,是因為有些數字在程式中會不斷的重複出現,為了增加程式的可讀性及減少程式維護的麻煩,此時即可用一個有意義的符號代替,但必須在符號之前加上保留字cons,則該符號的值將永遠保持在所宣告的符號中,程式中任何位置均不可能改變其值,此稱為符號常數,簡稱常數。例如令cons PI=3.14159,則每次要使用3.14159時,只要填入PI即可(註:常數符號通常均用大寫表示)。
又例如,銀行的利率亦應以常數符號代替,因為此一常數將會在不同的程式段重覆出現很多次,且此一利率亦會常修改,此時即可在程式的開頭宣告此一常數,如以下敘述。又例如,銀行的利率亦應以常數符號代替,因為此一常數將會在不同的程式段重覆出現很多次,且此一利率亦會常修改,此時即可在程式的開頭宣告此一常數,如以下敘述。 const Rae 0.02 則當欲引用此一常數時,皆應以Rae代替0.02。此外,當此一利率變動時,亦只要 於最前面的常數宣告處修改即可,免除到處修改的麻煩。但是,此利率若未用常數宣告,則若某些程式片段未同步修改,將造成程式執行的不一致。 • 以下敘述是常數宣告的語法,其位置在var的上面或下面均可,且不用指定其型態。Delphi將會依照所輸入的值,做最適當的記憶體配置。 const 常數識別字 = 常數 以下式子即是宣告M=3。 const M = 3
範例2-2b • 示範常數的宣告與使用。 • 本例為了說明cons的位置
變數或常數的有效範圍 • 一個大型專案通常由許多表單組合而成,且每一個表單可能包含許多函式、程序或類別。這些程式通常由許多人合力完成,為了避免彼此變數間互相干擾,例如張三設sunum=15、李四又設sunum=20,則必然造成無法預期的錯誤。 • 為了防止變數互相干擾,因此有變數的有效範圍,茲將變數的有效範圍敘述如下:任一變數的宣告均屬於區域變數,例如宣告於事件函式中,它的有效範圍僅止於該事件函式,其它的函式均無法取得該區域變數的值;若宣告在表單,則其有效範圍僅止於該表單,其它的表單是無法取得該區域變數的值。關於以上敘述,請看以下範例說明。
範例2-2c 示範變數的有效範圍 程式說明: • 1. 變數a、b屬於表單區域變數,其有效範圍僅止於本表單,也就是表單內的任何函式、程序均可存取a、b的內容。 • 2. 本例於FormCreae程序中宣告變數b、c、d,則FormCreae共可存取a、b、c、d等4個變數,且於此程序中重複宣告變數b,則此變數b與表單的變數b是彼此獨立的。 • 3. 本例於bnSarClick程序中宣告變數c,則此程序共可存取變數a、b、c,其中a、b是表單的區域變數,c是本程序獨立的變數。此外,此區域變數c與FormCreae的c雖然名稱相同,但卻是彼此獨立的。
2-3 運算子 • 所謂運算子(Operaor),指的是可以對運算元(Operand)執行特定功能的特殊符號。一般而言,運算子可分為以下幾類:指定(Assignmen)運算子、算術(Arihmeic)運算子、比較(Comparison)運算子、邏輯(Logical)運算子、位元操作(Biwise)運算子及字串(Sring)運算子;而每一種運算子都可以再細分為一元(Unary)運算子與二元(Binary)運算子。一元運算子只需要一個運算元就可以操作,而二元運算子則需要兩個運算元才能夠操作。 • 在以下單元中,我們除了檢視各種不同的運算子功能外,還將討論運算子的結合律(Associaiviy)與優先順序(Precedence)。優先順序是用來決定同一式子擁有多個運算子時,每一個運算子進行運算的順序;而結合律則決定了在同一敘述中,相同優先順序的運算子執行順序。
指定運算子 • 指定運算子的符號為 := (C++、Java及VB均使用 =),其作用為將運算符號右邊運算式的值指定給運算符號左邊的運算元。所以,以下敘述sum := a+b; 是將a+b的值指定給sum。 sum := 0,a := 3,b := 5; sum := a + b; • 上式與數學的等號是不同的,所以不要一直懷疑為什麼0會等於8。其次,你不能將常數放在指定運算子的左邊,例如下式: 8 := x ; • 此為一個不合法的敘述,但下式將常數8指定給變數x為合法的。 x := 8 ;
算術運算子(Arihmeic operaors) • 算術運算子用來執行一般的數學運算,包括取負數 ( - )、取正數( + )、加( + )、減( - )、乘( * )、除( / )、整數除法(div)及取餘數(mod)等,如下表所示:
關係運算子(Relaional operaors) 關係運算子又稱為比較運算子,用於資料之間的大小比較,比較的結果可得到邏輯的rue或False,下表是Delphi中的關係運算子符號。
邏輯運算子(Logical operaors) 當同一個運算式同時具有兩個以上的關係運算子時,則每兩個關係運算子之間必須使用邏輯運算子連結,Delphi的邏輯運算子如下表示:
字串運算子(Sring operaor) 前面關係運算子的 =、<>、>、<、>= 及 <= 均適用於字串的大小比較,而下表的字串連結+運算子,則可連結兩個字串。
運算子的優先順序 於較複雜的運算式中,通常同時存在許多運算子,此時就需要定義其優先順序,下表即是Delphi關於運算子的優先順序表(有部份運算子本書並未介紹,如shl、shr,有興趣的讀者請自行研究)。
當同一運算式中、同時包含多個運算子時,優先等級高的先行運算;當運算等級相同時,則由左至右逐一運算。請看下列式子:當同一運算式中、同時包含多個運算子時,優先等級高的先行運算;當運算等級相同時,則由左至右逐一運算。請看下列式子: x+y*z • 與x+(y*z)的效果相同。 但是以下式子若不加括號,編譯器即會弄錯。 x>2 and y>3 • 因為按照Delphi的運算子優先順序表,上式應同等於以下式子: x>(2 and y)>3
3-4 敘述與運算式 • 敘述(Saemen) 凡是控制執行的順序、對運算式取值或不作任何事,均可稱為敘述。所有的敘述都要以分號(;)作結束,以下式子即是一個敘述。於Delphi中,若前一個敘述未以分號結束,則錯誤訊息通常出現在下一個敘述的開頭。 sum := sum + 1 ;
敘述區塊(Block Saemen)或 複合敘述(Compund Saemen) 在任何可以放單一敘述的地方, 也就能放敘述區塊。敘述區塊亦稱為複合敘述,一個複合敘述是由begin...end組合而成,但end之後必須再加分號(;)作為結束,如下所示。 begin t := a ; a := b ; b := t ; end;
運算式(Expression) • 任何可求得值的式子,均稱為運算式,例如5+3會傳回一個數值,所以5+3是一個運算式,所有的運算式亦可成為一個敘述,以下是一些合法的運算式。一般而言,可以放在等號右邊的東西,都可以稱為運算式 i = 0 ; a = 3 ; b = 5 ; sum := 0 ; 6 ; //傳回6 4+5 ; //傳回9 sum > 3 ; //傳回False i ; //傳回0 a + b ; //傳回8 sum := a + b ; //傳回sum = 8
註解(Commens) 適當的程式註解能增加程式的可讀性,Delphi的註解有三種表示方式,第一種如下: {我是註解} • 上式在大括號({)開始即視為註解,在編譯程式時不予以處理,直到遇到右大括號 (})為止。例如以下二式後方均為註解: x := x + 3; { x值加3} sum := sum + y; { 將y之值加至sum} • 第二種註解方式與第一種類似,如下式: (* 我是註解 *) • 第三種是單一列的註解,凡是雙斜線(//)以後的敘述,Delphi均視為註解,例如: sum := sum + y; //將y值累加至sum