您的位置:学习中国 推荐教程 C++C语言 正文
原作者:kuku 添加时间:2007-06-02 原文发表:2007-06-02 人气:81 来源:互联网

本文章共9192字,分6页,当前第4页,快速翻页:
 


switch( a + 3 )
case 2: case 3: a++;
b *= a;
  上面就表示如果a + 3等于2或3,就跳到a++;的地址,进而执行a++,否则接着执行后面的语句b *= a;。这看起来很荒谬,有什么用?一条语句当然没意义,为了能够标识多条语句,必须使用复合语句,即如下: long a, b = 3;

switch( a + 3 )
{
 b = 0;
 case 2:
  a++; // 假设地址为3003
 case 3:
  a--; // 假设地址为3004
  break;
 case 1:
  a *= a; // 假设地址为3006
}
b *= a; // 假设地址为3010
  应该注意上面的“2:”、“3:”、“1:”在这里看着都是整型的数字,但实际应该把它们理解为标号。因此,上面检查a + 3的值,如果等于1,就跳到“1:”标识的地址,即3006;如果为2,则跳转到3003的地方执行代码;如果为3,则跳到3004的位置继续执行。而上面的break;语句是特定的,其放在switch后接的语句中表示打断,使程序跳转到switch以后,对于上面就是3010以执行b *= a;。即还可如此: switch( a ) if( a ) break;
  由于是跳到相应位置,因此如果a为-1,则将执行a++;,然后执行a--;,再执行break;而跳到3010地址处执行b *= a;。并且,上面的b = 0;将永远不会被执行。

  switch表示的是针对某个变量的值,其不同的取值将导致执行不同的语句,非常适合实现状态的选择。比如用1表示安全,2表示有点危险,3表示比较危险而4表示非常危险,通过书写一个switch语句就能根据某个怪物当前的状态来决定其应该做“逃跑”还是“攻击”或其他的行动以实现游戏中的人工智能。那不是很奇怪吗?上面的switch通过if语句也可以实现,为什么要专门提供一个switch语句?如果只是为了简写,那为什么不顺便提供多一些类似这种逻辑方案的简写,而仅仅只提供了一个分支选择的简写和后面将说的循环的简写?因为其是出于一种优化技术而提出的,就好象后面的循环语句一样,它们对逻辑的贡献都可以通过if语句来实现(毕竟逻辑就是判断),而它们的提出一定程度都是基于某种优化技术,不过后面的循环语句简写的成分要大一些。

  我们给出一个数组,数组的每个元素都是4个字节大小,则对于上面的switch语句,如下: unsigned long Addr[3];
Addr[0] = 3006;
Addr[1] = 3003;
Addr[2] = 3004;
  而对于switch( a + 3 ),则使用类似的语句就可以代替:goto Addr[ a + 3 – 1 ];

  上面就是switch的真面目,应注意上面的goto的写法是错误的,这也正是为什么会有switch语句。编译器为我们构建一个存储地址的数组,这个数组的每个元素都是一个地址,其表示的是某条语句的地址,这样,通过不同的偏移即可实现跳转到不同的位置以执行不同的语句进而表现出状态的选择。

  现在应该了解为什么上面必须是<整型数字>了,因为这些数字将用于数组的下标或者是偏移,因此必须是整数。而<整型常数1>必须是常数,因为其由编译时期告诉编译器它现在所在位置应放在地址数组的第几个元素中。

  了解了switch的实现后,以后在书写switch时,应尽量将各case后接的整型常数或其倍数靠拢以减小需生成的数组的大小,而无需管常数的大小。即case 1000、case1001、case 1002和case 2、case 4、case 6都只用3个元素大小的数组,而case 0、case 100、case 101就需要102个元素大小的数组。应该注意,现在的编译器都很智能,当发现如刚才的后者这种只有3个分支却要102个元素大小的数组时,编译器是有可能使用重复的if语句来代替上面数组的生成。

  switch还提供了一个关键字——default。如下: long a, b = 3;
switch( a + 3 )
{
 case 2:
  a++;
  break;
 case 3:
  a += 3;
  break;
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 下一页>>
本页地址
相关文章

C++程序中导出Word文档简易方法
理解隐式接口和编译期多态
C++对象布局及多态之虚成员函数调用
如何访问模板化基类中的名字
对象布局及多态探索之菱形结构虚继承
C++之父Bjarne谈C++中的STL模板
C++箴言:用成员函数模板接受兼容类型
探索C++的秘密之详解extern C
C++箴言:为类型信息使用特征类
创建可移植的64位应用程序代码
对象布局及多态实现之成员函数的调用
C++箴言:谨慎使用私有继承
C++编程人员容易犯的10个C#错误
C语言 编程实例

相关评论


本文章所属分类:首页 推荐教程 C++C语言   C++C语言