CPP练习题(1)

1.关系运算符<= 与 == 的优先级相同。请问这句话的说法是正确的吗?

A.正确    B.错误

正确答案: B

解析:==的优先级小于<=。

2.以下数据中,不正确的数值或字符常量是()。

A.c    B.66    C.0xaa    D.50

正确答案: A

解析:带单引号才是字符常量,A应为'c'。

3.派生类对象可以访问基类成员中的()?

A.公有继承的私有成员

B.私有继承的公有成员

C.公有继承的保护成员

D.以上都错

正确答案: D

解析:

A.公有继承的私有成员不被继承,所以不能访问
B.私有继承的公有成员可以被类的方法访问,不能被对象访问,属于私有属性
C.公有继承的保护成员具有保护属性,只能被类的方法访问,不能被对象访问

4.以下描述错误的是()。

A.函数的形参在函数未调用时不分配存贮空间

B.若函数的定义出现在主函数之前且仅被主函数使用,则可以不必再说明

C.若一个函数(非主函数)没有return语句,返回类型是void

D.一般来说,函数的形参和实参的类型应该一致

正确答案: C

解析:构造函数和析构函数都没有返回类型,也没有return语句。

5.已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,( )是正确的。

A.void print( ) const;

B.const void print( );

C.void const print( );

D.void print(const);

正确答案: A

解析:const在后面,是用来修饰对象中的this,表明这个成员函数不能修改this指向的值,即不能修改对象的值。

6.定义函数模板add,以下说法正确的有()。(多选)

A.pfun2 = add失败,需要显示定义为pfun2 = add<int>

B.pfun1 = add

C.pfun3 = add失败,add无法正确推导

D.pfun4 = add<int>失败,函数指针不可赋值

正确答案: BC

解析:

A:pfun2 = add的错误提示不是pfun2 = add,而是 no matches converting function 'add' to type 'const int (*)(int&, int&);

B:pfun1的参数和返回值一致,可以自动推导,正确赋值;

C:pfun3 = add赋值失败,失败原因和A一样;

D:pfun4 = add显示的指定类型T为int型,赋值正确。

7.给出以下定义, 则对两个数组的strlen正确的叙述为()
1
2
char x[]= "abcdefg" ;
char y[]={ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' };

A.数组X和数组Y等价

B.数组X和数组Y长度相同

C.数组X的长度大于等于数组Y的长度

D.数组X的长度小于等于数组Y的长度

正确答案: D

解析:strlen函数以'\0'为结尾判断符,char x[]="abcdefg";定义x数组默认追加结尾符'\0',char y[]={'a','b','c','d','e','f','g'};没有结尾符,strlen(y)的结果是遇到第一个'\0',是一个未定值,因此答案是数组x的长度小于等于y的长度

8.当参数*x=1, *y=1, *z=1时,下列不可能是函数add的返回值的( )?
1
2
3
4
5
6
int add(int *x, int *y, int *z){
    *x += *x;
    *y += *x;
    *z += *y;
    return *z;
 }

A.4    B.5    C.6    D.7

正确答案: D

解析:(注意x,y,z指针可能指向同一地址,也可能指向不同的地址。)

有以下5中情况:

1.int x=1,y=1,z=1,add(x,y,z)return 4

2.int x=y=1,z=1,add(x,y,z)return 5

3.int x=z=1,y=1,add(x,y,z)return 5

4.int y=z=1,x=1,add(x,y,z)return 6

5.int x=y=z=1,add(x,y,z)return 8

(可上机自行验证)

9.下面程序输出是什么()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main()
{
    bool first=true;
    int sum=0;
    int value;
    unsigned short i=0xFFFF;
    for (;i>=0;--i)
    {
        if (first)
        {
            value=65536;
            sum+=value%3;
            first=false;
        }
        else{
            sum+=--value%3;
            if (value<=0)
            {
                cout<<sum<<","<<i;
                break;
            }
        }
    }
    return 0;
}

A.65535,65535

B.65535,65536

C.65535,1

D.65536,65535

正确答案: D

解析:(注意i的类型为unsigned short)

由于i是无符号数,因此 i>=0恒成立,代码停止条件为value<=0。另外注意,--的优先级高于%。
1、if(first)只执行一次,执行结果为sum=1;value=65536.
2、此后的for循环一直执行else中的代码。试着找一个规律,每3个for循环,value值减少3,sum值增加3,因此当3的倍数次for循环之后,value等于1时(65536%3=1),sum值等于1+(65536-1)=65536. 这时已经执行了65536次for循环了,从第二次for循环开始执行--i,此时i=0x0000。
3、当value=1时,执行最后一遍for循环中else的语句,--value,所以 value=0。sum+=value%3,所以sum=65536+0=65536。 i-1=-1=0xFFFF, 所以cout<<i,i转为十进制无符号数为65535。

10.如下代码的输出结果是()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int function2( int a[],  int b,  int e)
{
     if (e-b<=1)  return abs (a[b]-a[e])>=3?a[b]:a[e];
     int l = 0, r = 0;
     l = function2(a, b, b + (e - b) / 2);
     if (l % 2 == 0)
         r = function2(a, b + (e - b) / 2 + 1, e);
     else
         return l;
     if (l | r)
         return l | r;
     else
         return r;
}
 
int main()
{
     int a[] = { 10,5,8,4,5,20,2,3 };
     cout << function2(a, 0,  sizeof (a) /  sizeof (1)) << endl;
     int b[] = { 3,5,8,4,8,30,2,3 };
     cout << function2(b, 0,  sizeof (b) /  sizeof (1)) << endl;
     return 0;
}


A.15,5

B.10,5

C.20,3

D.其他

正确答案: A

解析:(考察递归)

首先数组a:sizeof(a)/sizeof(1)=8*4/4=8;
function2(a,0,8)-->function2(a,0,4)-->function2(a,0,2)-->function2(a,0,1);
function2(a,0,1):return  abs(a[0]-a[1])>=3?a[0]:a[1]即return 10(此时l=10),返回到function2(a,0,2)里继续往下执行;
l%2==0成立,r=function2(a,2,2):return  abs(a[2]-a[2])>=3?a[2]:a[2]即return 8(此时r=8);
10|8即1010|1000=1010即return 10(此时l=10),返回到function2(a,0,4)里继续往下执行;
l%2==0成立,r=function2(a,3,4):return  abs(a[3]-a[4])>=3?a[3]:a[4]即return 5(此时r=5);
10|5即1010|0101=1111即return 15(此时l=15),返回到function2(a,0,8)里继续往下执行;
l%2==0不成立,return l(返回15),即最终结果为15.

数组b很简单:sizeof(b)/sizeof(1)=8*4/4=8;
function2(a,0,8)-->function2(a,0,4)-->function2(a,0,2)-->function2(a,0,1);
function2(a,0,1):return  abs(a[0]-a[1])>=3?a[0]:a[1]即return 5(此时l=5),返回到function2(a,0,2)里继续往下执行;
l%2==0不成立,return l(返回5,此时l=5),返回到function2(a,0,4)里继续往下执行;
l%2==0不成立,return l(返回5,此时l=5),返回到function2(a,0,8)里继续往下执行;
l%2==0不成立,return l(返回5),即最终结果为5。

(题目来源:牛客网, 这是我的错题集,也希望对你有帮助。如果您是题目的作者,且不同意我发表,请联系我删除文章。

猜你喜欢

转载自blog.csdn.net/qq_42289906/article/details/80460816