1
2
3
4
5
6
7
8
|
int
main()
{
int
arr[]={
1
,
2
,
3
,
4
,
5
,
6
,
7
};
int
*p=arr;
*(p++)+=
89
;
printf(
"%d,%d\n"
,*p,*(++p));
return
0
;
}
|
A.3 3 B.2 2 C.2 3 D.3 2
正确答案: A
首先在第五行中,p指针的位置往后挪了一位,指向了arr[1]。在C++中,函数的参数是从右往左进栈的,之所以会有这种情况,是因为有不定参数个数的函数存在,而printf则是典型的不定参数个数的函数,在第六行的printf中,先进栈的是*(++p),所以此时p指向arr[2],而后入栈的*p参数时,依然指向的是这个位置,所以答案为3 3.
2.阅读c++代码输出()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class
base1{
private
:
int
a,b;
public
:
base1 (
int
i ) : b(i+
1
),a(b){}
base1():b(
0
),a(b){}
int
get_a(){
return
a;}
int
get_b(){
return
b;}
};
int
main()
{
base1 obj1(
11
);
cout<<obj1.get_a()<<endl<<obj1.get_b()<<endl;
return
0
;
}
|
A.12 12 B.随机数 12 C.随机数 随机数 D.12 随机数
正确答案: B
此题跟上一题相似,因为函数的参数是从右至左进栈的,故第11行的构造函数中,先执行的a的赋值,由于此时b还未赋值,故其值为随机数,故选B。
3.以下代码在64位的机子上输出是什么:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
int
getSize(
int
data[]){
return
sizeof(data);
}
int
main(){
int
data1[] = {
1
,
2
,
3
,
4
,
5
};
int
size1 = sizeof(data1);
int
* data2 = data1;
int
size2 = sizeof(data2);
int
size3 = getSize(data1);
printf(
"%d, %d, %d"
, size1, size2, size3);
return
0
;
}
|
A.20 8 8 B.4 4 4 C.20 4 20 D.20 20 20
正确答案: A
首先第8行的size1的值为数组data1的大小,也就是5*4(int) = 20。第11行的size2求得的是指针data2的大小4。然后是第13行的size3,其值为getSize这个函数算出来的,而这个函数传过去的参数其实是一个指针,所以它的值也为4。
4.有以下程序
1
2
3
4
5
6
7
8
|
#include<iostream>
#include<stdio.h>
using
namespace
std;
int
main(){
int
m=0123, n = 123;
printf
(
"%o %o\n"
, m, n);
return
0;
}
|
A.0123 0173 B.0123 173 C.123 173 D.173 173
正确答案: C
第五行的初始化中,m的值为8进制的0123,故其在最后按8进制输出的时候值就为123,而n一开始为十进制的123,故最后的输出为173.