练习5.13:下面显示的每个程序都含有一个常见的编程错误,指出错误在哪里, 然后修改它们。
unsigned aCnt = 0, eCnt = 0, iouCnt = 0; char ch = next_text(); switch(ch){ case 'a': aCnt++; case 'e': eCnt++; default: iouCnt++; }
unsigned index = some_value(); switch(index) { case 1: int ix = get_value (); ivec[ ix ] = index; break; default: ix = ivec.size()-1; ivec[ ix ] = index; }
unsigned evenCnt = 0, oddCnt = 0; int digit = get_num() % 10; switch(digit) { case 1, 3, 5, 7, 9: oddcnt++; break; case 2, 4, 6, 8, 10: evencnt++; break; }
unsigned ival=512, jval = 1024, kval=4096; unsigned bufsize; unsigned swt = get_bufCnt(); switch(swt) { case ival: bufsize = ival * sizeof (int); break; case jval: bufsize = jval * sizeof (int); break; case kval: bufsize = kval * sizeof (int); break; }
【出题思路】
switch语句有几个语法要点:必须在必要的地方使用break;语句,应该把变置定义在块作用域内,case标签只能有一个值且不能是变量。
【解答】
(a) 的错误是在每个case分支中都缺少了 break;语句,造成的后果是一旦执行了前面的case分支,必定还会继续执行接下来的其他case分支。举例说明,如果ch的内容是字符‘a’,则aCnt、eCnt和iouCnt的值都会增加;如果ch的内容是齐符‘e’,则eCnt和iouCnt的值都会增加,这显然与程序的预期是不相符的。
修改后的程序如下所示:
unsigned aCnt = 0, eCnt = 0, iouCnt = 0; char ch = next_text(); switch(ch){ case 'a': aCnt++; break; case 'e': eCnt++; break; default: iouCnt++; break; }
(b) 的错误是在case分支中定义并初始化了变量ix,同时在default分支中使用了该变量,此时如果控制流跳过case分支而直接到达default分支,则会试图使用未经初始化的变量,因而该程序无法通过编译。解决办法是,把ix的定义放置在switch语句之前。
修改后的程序如下所示:
unsigned index = some_value(); int ix; switch(index) { case 1: ix = get_value(); ivec[ ix ] = index; break; default: ix = ivec.size()-1; ivec[ ix ] = index; }
(c) 的错误是在同一个case标签中放置了多个值,而CH规定一个case标签只能对应一个值。修改后的程序如下所示:
unsigned evenCnt = 0, oddCnt = 0; int digit = get_num() % 10; switch(digit){ 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)的错误是使用变量作为case标签的内容,C++规定,case标签的内容只俳是整型常量表达式。修改后的程序如下所示:
const unsigned ival=512, jval=1024, kval=4096; unsigned bufsize; unsigned swt = get_bufCnt(); switch(swt) { case ival: bufsize = ival * sizeof(int); break; case jval: bufsize = jval * sizeof(int); break; case kval: bufsize = kval * sizeof (int); break; }
本页共138段,5037个字符,6015 Byte(字节)