跳转语句——goto
前面已经说明,源代码(在此指用C++编写的代码)中的语句依次地转变成用长度不同的二进制数表示的机器代码,然后顺序放在内存中(这种说法不准确)。如下面这段代码:
long a = 1; // 假设长度为5字节,地址为3000 a += 1; // 则其地址为3005,假设长度为4字节 b *= a; // 则其地址为3009,假设长度为6字节 | 上面的3000、3005和3009就表示上面3条语句在内存中的位置,而所谓的跳转语句,也就是将上面的3000、3005等语句的地址放到前面提过的指令寄存器中以使得CPU开始从给定的位置执行以表现出执行顺序的改变。因此,就必须有一种手段来表现语句的地址,C++对此给出了标号(Label)。
写一标识符,后接“:”即建立了一映射,将此标识符和其所在位置的地址绑定了起来,如下:
long a = 1; // 假设长度为5字节,地址为3000 P1: a += 1; // 则其地址为3005,假设长度为4字节 P2: b *= a; // 则其地址为3009,假设长度为6字节 goto P2; | 上面的P1和P2就是标号,其值分别为3005和3009,而最后的goto就是跳转语句,其格式为goto <标号>;。此语句非常简单,先通过“:”定义了一个标号,然后在编写goto时使用不同的标号就能跳到不同的位置。
应该注意上面故意让P1和P2定义时独占一行,其实也可以不用,即:
long a = 1; P1: a += 1; P2: b *= a; goto P2; | 因此看起来“P1:”和“P2:”好象是单独的一条定义语句,应该注意,准确地说它们应该是语句修饰符,作用是定义标号,并不是语句,即这样是错误的:
long a = 1; P1: { a += 1; P2: b *= a; P3: } goto P2; | 上面的P3:将报错,因为其没有修饰任何语句。还应注意其中的P1仍然是3005,即“{}”仅仅只是其复合的作用,实际并不产生代码进而不影响语句的地址。 |