行号 (程式语言)
行号是程式语言中的一个用语,是用来识别文本文件各行的数字。最常见的作法是在各行指定不重复的数字,第一行数字为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).