0513108

练习5.13:下面显示的每个程序都含有一个常见的编程错误,指出错误在哪里, 然后修改它们。

(a)

unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch(ch){
    case 'a': aCnt++;
    case 'e': eCnt++;
    default: iouCnt++;
}

(b)

unsigned index = some_value();
switch(index) {
case 1:
    int ix = get_value ();
    ivec[ ix ] = index;
    break;
default:
    ix = ivec.size()-1;
    ivec[ ix ] = index;
}

(c)

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;
}

(d)

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