下面每段代码都暴露了一个常见编程错误。请指出并修改之。
(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中可以使用以上的省略形式,但是只能使用以上的形式。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; }(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)