行号编程语言中的一个用语,是用来识别文本文件各行的数字。最常见的作法是在各行指定不重复的数字,第一行数字为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其编译器已和文本编辑器集成,程式设计者可以双击错误消息,直接跳到有错误的程序中进行修正。

参考资料

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.