行號 (程式語言)
行號是程式語言中的一個用語,是用來識別文字檔案各行的數字。最常見的作法是在各行指定不重複的數字,第一行數字為1,後續各行依序加一。
C語言中原始碼的行號定義成從檔案開始到指定位置之間,所讀到換行符號的個數再加一[1]。
在一些古老的程式語言(如GW-BASIC)中,行號是程式語法中必需的一部份。[2] 主要原因是當時的作業系統缺乏互動式的文字編輯器,程式編輯器的介面往往只有行編輯器。指定行號可以使編輯器知道要編輯哪一行,也可以在原代碼的特定位置中插入一行。行號也可以將程式實際需要執行的先後順序和輸入程式時的順序區隔開來。
現在的作業系統普遍都有互動式文字編輯器的功能,因此大部份的程式語言都已不需要行號。
非連續行號
[編輯]在BASIC語言中,一般行號不會使用連續整數(如1, 2, 3, …),會使用像10, 20, 30, …的數列,好處是可以在二行之間再插入程式碼。例如程式設計者在行號20及30的程式之間漏了一些程式,可以增加一行行號為25的程式,其程式就會在行號20及行號30之間。若行號使用連續整數,若要在行號2及3的程式中新增程式,就需要重新編排行號3及後續的所有程式。
即使是使用10,20,30的行號編排方式,若要在二行之間加入超過9行的程式碼,仍然需要重新編排部份程式碼的行號。不過需調整行號的程式碼數量會減少許多,每增加10行程式才需要重新編排一行程式碼的行號。例如要在行號20及行號30之間新增10行,最後行號30的程式需修改行號,但行號40的程式仍可維持原來的行號不需修改。
有些BASIC語言有RENUM指令,可以針對整個程式(或程式的一部份)重編等間距的行號,此指令也會同步修改參考到這些行號的程式,因此重編行號不會影響程式的正常運作。
若一些大型的程式包含子程式,子程式的啟始行號一般會有較大的整數(如1000, 2000, 3000, …),可以使子程式和主程式之間餘留足夠的空間,子程式彼此之間也可餘留足夠的空間。
行號和GOTO
[編輯]在BASIC等未結構化的程式語言中,行號也用來標示分支指令的目的地。例如:
10 IF X = 42 GOTO 40'最前面的"10"是行號,X=42時會跳到行號=40的程式碼,否則會跳到下一行
20 X = X + 1
30 GOTO 10'跳到行號=10的程式碼
40 PRINT "X是42!"'輸出"X是42!"
一般認為Goto型式的分支是比較差的程式風格,因為容易形成複雜而難以理解的麵條式代碼,細節可參照視為有害及結構化編程。雖然一些版本的BASIC仍要求標註行號,但多半會將GOTO改為更結構化的流程控制指令,如for迴圈及while迴圈。
像是C語言及C++之類的語言仍保留GOTO指令,不過GOTO的目的地已改用標記標示。這類的GOTO指令一般也不建議使用,只建議在少數情形下使用,例如跳出多重迴圈:
while(1) {
while (1) {
if (done) {
goto freedom;
}
}
}
freedom:
上述的程式可以和以下不使用GOTO的程式比較,以下的程式需在不同位置依done變數值進行判斷,相較之下,上述的程式可讀性較高。
while(1) {
while (1) {
if (done) {
break;
}
}
if (done) {
break;
}
}
行號和語法錯誤
[編輯]若程式中有語法錯誤,編譯器(或直譯器)會在編譯(或執行)過程中出現特定行號的程式有錯的錯誤訊息,此訊息有助於程式設計者找到有誤的程式碼。
在許多現代的程式語言中仍使用行號來標示有錯誤程式的位置,這種的語言中不需要使用者輸入行號,每行的行號是由編譯器(或直譯器)直接計算原始碼中換行字元而得,在一些整合式開發環境中也會自動顯示行號,例如Microsoft Visual Studio其編譯器已和文字編輯器整合,程式設計者可以雙擊錯誤訊息,直接跳到有錯誤的程式中進行修正。
參考資料
[編輯]- ^ 6.10.4 Line control. 2008-01-30 [2011-03-13]. (原始內容存檔於2011-07-08).
- ^ Differences Between GW-BASIC and QBasic. 2003-05-12 [2011-03-13]. (原始內容存檔於2013-10-19).