Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104586000
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 20:35:08

  来源:BLOG    作者:chuiyun

跳转语句——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,即“{}”仅仅只是其复合的作用,实际并不产生代码进而不影响语句的地址。

阅读(223) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~