牛客网错题整理--C++篇1
1.下列程序的运行结果是PP 10003,请为横线处选择合适的程序():
#include<stdio.h>
#include<string.h>
struct STU
{
char name[10];
int num;
};
void f(char_____, int num)
{
struct STU s[2]={{"SS",10001},{"PP",10002}};
num = s[1].num;
strcpy(name, s[1].name);
}
main()
{
struct STU s[2]={{"YY",10003},{"LL",10004}},*p;
p=s;
f(p->name, p->num);
printf("%s %d\n", p->name, p->num);
}
A. *name
B. name[]
C. name
D. &name
正确答案:AB 我的答案:A
错误原因:在考虑传入指针时忽略了数组名作为形参被使用时可被当作指针处理,仅考虑了传入指针作为形参。
逐项分析:
A. 传入指向name数组的指针,默认指向首地址,可行。
B. 作为形参传入时数组名会退化为指针,默认为数组首地址,可行。
C. 显然不对,这是数组不是变量。
D. 传入时加&表示传递引用。而不是传入字符串,因此不行,修改为char* const&name后正确。
2.下列关于C/C++的宏定义的说法中,不正确的是:
A.宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用 const常量。
B.宏的嵌套定义过多会影响程序的可读性,而且很容易出错。
C.相对于函数调用,宏定义可以提高程序的运行效率。
D.宏定义不检查参数正确性,这样会有安全隐患。
正确答案:A 我的答案:D
错误原因:其实做的时候没审题,我以为问的是正确的一项,因为D对得不能再对了就直接选了,下次注意下次注意。
逐项分析:
首先在分析之前确定一件事:宏定义的工作原理。
在进行编译之前,编译器会将宏定义中的内容在你的代码里原封不动的进行替换。
没错,原封不动,你怎么写,他怎么替换,所以这就导致了宏定义不会管你参数对不对,语法出没出问题,嵌套是否过多等等,虽然这种直接替换有提高效率的好处,但是带来的问题也同样致命,所以谨慎使用。
A. 唯一错误的一项,基于之上所说的问题,在代码中尽量使用const定义常量,而谨慎使用宏定义去定义一些常量。
B. 之上解释过,不再赘述
C. 相对于函数调用,宏定义的确的可以减少程序的运行效率,宏定义在编译之前就对于代码内容进行替换,提升了运行效率,但同时存在以上的问题,所以谨慎使用。
D. 之上解释过,不再赘述。
3.在32位计算机中,下面输出是多少( ):
#include <iostream>
using namespace std;
typedef enum
{
Char ,
Short,
Int,
Double,
Float,
}TEST_TYPE;
int main() {
TEST_TYPE val;
cout<< sizeof(val)<<endl;
return 0;
}
A. 5
B. 4
C. 8
D. 12
正确答案:B 我的答案:D
错误原因:注意注意,千万注意,看代码看仔细了,我根本没看到enum,直接当成结构体算的。
分析:枚举类与结构体之间在内存大小上的区别就是,枚举类中的每个元素都只是整型常数,本质上是一组常数的集合体,只是这些常数有各自的命名。因此由它产生的每个枚举变量的大小都是一个整形的大小,也就是4。
4.若PAT是一个类,则程序运行时,语句“PAT(*ad)[3];”调用PAT的构造函数的次数是( )。
A. 2
B. 3
C. 0
D. 1
正确答案:C 我的答案:D
错误原因:我把PAT(*ad)[3]当成了一个结构体指针数组,结构体数组里面每个节点里面存指针,应该是三个指向结构体的指针。
分析:PAT(*ad)[3] 本质上是三个指向pat类型的名为ad的指针,所以构造函数调用次数为0。
5.在x86的机器上,int a=0xabcd1234 char b=((char*)&a)[0]请问b是多少?
A. 0xa
B. 0x4
C. 0xab
D. 0x34
正确答案: D 我的答案:C
错误原因:之前对于X86机器没什么了解,在看完解释后有了一定理解。X86机器为小端存储机,存储方式为低位0x34,而不是正常的0xab,至于为什么是两位,在正常环境中,int类型占4个字节,char类型占一个字节,也就是8位中取出两位,从后端取所以为0x34,在C++编译器中最后会显示为4(0x34的asci码表示为4)。
分析:如上。