switch结构注意点

下面每段代码都暴露了一个常见编程错误。请指出并修改之。

(a) switch (ival) {
             case 'a': aCnt++;
             case 'e': eCnt++;
             default: iouCnt++;
         }
(a)的错误在于:各个case标号对应的语句块缺少必要的break语句,从而当ival值为'a'时,aCnt、eCnt和IouCnt都会加1;ival值为'e'时,eCnt和iouCnt都会加1.

修改为:

switch(ival){
case 'a':
aCnt++;
break;
case 'e':
eCnt++;
break;
default:
iouCnt++;
break;	//此语句省略亦可
}
知识点:例如本例:switch结构中,如果输入时'a'.程序从case 'a';开始执行后并没有结束,而是继续跨越case边界继续执行其他语句,直到switch结束或遇到break语句为止。

(b) switch (ival) { case 1: int ix = get_value(); ivec[ ix ] = ival; break; default: ix = ivec.size()-1; ivec[ ix ] = ival; }
(b):的错误在于:在case1标号之后、default标号之前定义了变量ix。因为,对于switch结构,只能在它的最后一个case标号或default标号后面定义变量,以避免出现代码跳过变量的定义和初始化情况。
修改为:
int ix;
switch(ival){
case 1:
ix = get_value();
ivec[ix] = ival;
break;
default:
ix = ivec.size()-1;
ivec[ix] = ival;
}

知识点:
对于switch结构,只能在它的最后一个case标号或default标号后面定义变量,或是在switch(int ival = get_response())中的定义:
     (c) switch (ival) {
             case 1, 3, 5, 7, 9:
                 oddcnt++;
                 break;
             case 2, 4, 6, 8, 10:
                 evencnt++;
                 break;

         }

(c):的错误在于:case标号中出现了多个值。因为一个case标号只能与一个值相关联。
修改为:
switch(ival){
       case 1:
       case 3:
       case 5:
       case 7:
       case 9:
               oddcnt++;
               break;
       case 2:
       case 4:
       case 6:
       case 8:
       case 10:
               evencnt++;
               break;
}
知识点:switch中可以使用以上的省略形式,但是只能使用以上的形式。

     (d) int ival=512 jval=1024, kval=4096;
         int bufsize;
         // ...
         switch(swt) {
             case ival:
                 bufsize = ival * sizeof(int);
                 break;
             case jval:
                 bufsize = jval * sizeof(int);
                 break;
             case kval:
                 bufsize = kval * sizeof(int);
                 break;
         }
(d):的错误在于:case标号中不能使用ival、jval和kval。因为case标号中的值只能使用常量表达式,而ival、jval和kval都是常量。
将语句int ival = 512, jval = 1024, kval = 4096; 修改为:
const int ival = 512, jval = 1024, kval = 4096;
知识点: case标号必须是整型常量表达式。注:整数、字符和布尔值的算术类型合称为整型(itergral type)

你可能感兴趣的:(switch结构注意点)