目录
1.已知 int i=3; 下面 do_while 语句循环次数为()
2. 下列关于C/C++的宏定义的说法中,不正确的是:
3.下面程序段的运行结果是()
4.如下c++程序
5.以下程序的输出是()
6.下列程序输出的 * 个数是()
1.已知 int i=3; 下面 do_while 语句循环次数为()
do {
i--;
cout << i << endl;
} while (i != 1);
答案:2
解析:
cout 表示输出语句,endl表示换行(即endline),二者中间的是输出内容
要通过while()才算一次,没通过就不算。
2. 下列关于C/C++的宏定义的说法中,不正确的是:
答案:A
解析:
A
宏定义由预编译器来处理,当你定义一个记号#define RATIO 1.652时,RATIO可能从未被编译器看到,而直接被预处理其移走了,如果你的定义是#define RATIO ,在预处理进行一个宏替换的时候,由于你调用地方的特殊性,你会获得一个莫名奇妙的错误,但是如果你使用的const double RATIO = 1.652,当你没有初始化这个变量,则在这个变量出错地方编译器将给出错误信息,可以方便程序设计者很快的找出错误所在。这就是在effective C++中作者所说的尽量以const enum inline 替换define 条款。
3.下面程序段的运行结果是()
char s[]="abcdefgh",*p =s;
p += 3;
printf("%dn", strlen(strcpy(p,"ABCD")));
答案:4
解析:
strcpy(p,"ABCD”)的功能是将字符串”ABCD”复制到指针变量p所指向的内存
单元中,其返回值是指针p所指内存单元的地址,然后计算p所指字符串的长度,显然是
4。所以正确答案是C。
4.如下c++程序
int i=0x22222222;
char szTest[]="aaaa"; //a的ascii码为0x61
func(I, szTest); //函数原型为void func(int a,char *sz);
请问刚进入func函数时,参数在栈中的形式可能为 (左侧为地址,右侧为数据—)
答案:D
解析:
1,对于x86,栈的增长方向是从大地址到小地址
2,对于函数调用,参数的入栈顺序是从右向左
3,函数调用入栈顺序是 右边参数-->左边参数-->函数返回地址
符合的只有D
C明显不对,即使栈增长方向是从小地址到大地址,0x00000000也明显不是函数返回地址
5.以下程序的输出是()
struct HAR {
int x,y;
struct HAR *p;
} h[2];
int main()
{
h[0].x = 1;
h[0].y = 2;
h[1].x = 3;
h[1].y = 4;
h[0].p = &h[1];
h[1].p = h;
printf("%d,%d n", (h[0].p)->x, (h[1].p)->y);
}
答案:3,2
解析:
h是大小为2的结构体数组,对其两个元素
进行赋值后得内存映像如图1-1所示,其输出结果应为3,
2。故正确答案是D。
6.下列程序输出的 * 个数是()
class Point {
public:
Point(int xx = 0, int yy = 0) {
X = xx;
Y = yy;
}
Point(Point &p) {
X = p.X;
Y = p.Y;
cout << "*";
}
private:
int X, Y;
};
class Line {
public:
Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) {}
private:
Point p1, p2;
};
答案:4
解析:
Line (Point xp1, Point xp2):p1(xp1),p2(xp2)中使用的是传值,myp1和myp2传值给xp1,xp2时使用了两次复制构造函数.
p1(xp1),p2(xp2)又使用了两次,因此一共是四次。



