练习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(字节)