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;将永远不会被执行。