上面虽然看起来很复杂,但依旧是一个单句,应该注意当写了一个“else”时,编译器向上寻找最近的一个“if”以和其匹配,因此上面的“else”是和“if( a < 10 )”匹配的,而不是由于上面那样的缩进书写而和“if( a )”匹配,因此b *= a;只有在a大于等于10的时候才执行,而不是想象的a为零的时候。
还应注意前面书写的if( a ) long c;。这里的意思并不是如果a非零,就定义变量c,这里涉及到作用域的问题,将在下篇说明。 switch 这个语句的定义或多或少地是因为实现的原因而不是和“if else”一样由于逻辑的原因。先来看它的格式:switch(<整型数字>)<语句>。
上面的<整型数字>和if语句一样,只要是一个数字就可以了,但不同地必须是整型数字(后面说明原因)。然后其后的<语句>与前相同,只要是语句就可以。在<语句>中,应该使用这样的形式:case <整型常数1>:。它在它所对应的位置定义了一个标号,即前面goto语句使用的东西,表示如果<整型数字>和<整型常数1>相等,程序就跳转到“case <整型常数1>:”所标识的位置,否则接着执行后续的语句。
long a, b = 3; 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;将永远不会被执行。 |