牛客网错题整理–C++篇2
- 32位编译器下,sizeof(void)的值是多少?
A. 0
B. 4
C. 这取决于主机的字的大小。
D. 8
E. 编译错误或者为1
正确答案: E 我的答案: C
错误原因:理论上说,不能够创建void类型的变量,因为那没有意义,在C++中不能够直接sizeof void类型 。做题的时候没注意,这个知识点忽略了。
分析:如上,如果改为sizeof(void *)则为4,32位机器中指针大小为4字节。
- 设 x,y,t 均为 int 型变量,执行下列语句后,y的值为()。
x=y=3; t=++x||++y;
A. 不确定
B. 4
C. 3
D. 1
正确答案: C 我的答案: B
错误原因: 啊这,又忘记了逻辑表达式的特殊用法了。。
在逻辑表达式中因为 “||” 表达式在左侧表达式为真时不会再去运行右侧表达式,因此++y得表达式就被忽略掉了,因此最后为3而不是4。这是逻辑表达式的特殊用法,要记住。 (注:此外逻辑表达式 “&&” 的用法同 “||”,在前面的表达式为假时,同样会忽略后面的表达式。)
分析:赋值之后,x = 3, y = 3。 进入第二个表达式时,先执行++x,表达式为真,跳过第二个表达式,执行完整个语句后,x=4,y=3。
- 源程序中凡是行首以#标识的控制行都是预处理指令。以上描述是否正确?
A.正确
B.错误
正确答案: A 我的答案: B
错误原因:没啥好说的,确实是没仔细想过,涨知识了,过吧。。。
分析:C++源程序中以#标识的控制行都是预处理命令,其中包括
1.头文件包含 #include
2.宏定义 #define
3.条件编译 #ifdef #endif
这三个控制行都是在编译阶段编译之前编译器自动进行处理的内容,属于预处理命令。
- 以下值不等于3的表达式是():
A. ‘D’-‘A’
B. ‘6’-‘3’
C. ‘\011’
D. 3+’\0’
正确答案: C 我的答案: D
错误原因:疏忽了呀,把"\011"当二进制处理了啊,这个表达式是八进制啊,另一方面还把ascii码忘了,’\0’对应的ascii码就是0,就是字符串最后的那个啊,知识还是得经常复习啊。。。
逐项分析:
A. ascii码的字母对应,之间差几个,对应的数就是几,A-D中间差三个,对应答案就是3。
B. ascii码的数字对应,之间差几个,对应的数就是几,3-6中间差三个,对应答案就是3。
C. 详见错误原因
D. 详见错误原因
- 有如下程序:执行后的输出结果应该是:
#include<iostream>
class cla{
static int n;
public:
cla(){n++;}
~cla(){n--;}
static int get_n(){return n;}
};
int cla::n=0;
int main()
{
cla * p=new cla;
delete p;
std::cout<<"n="<<cla::get_n()<<std::endl;
return 0;
}
A. n=0
B. n=1
C. n=3
D. n=4
正确答案: A 我的答案: B
错误原因:首先根据构造函数和析构函数可以知道此时主函数中前两行执行完毕后n=0,我以为当再调用get_n函数时会再调用一次构造函数导致n的值为1,但是调用成员函数时并没有创建相应对象,因此此时n还是0,所以答案应该是A。
分析:同上,主函数前两行分别调用构造函数和析构函数。
- 以上程序输出是多少?
#define A(x) x+x
int i=5*A(4)*A(6);
cout<<i;
A. 50
B. 100
C. 120
D. 480
正确答案: A 我的答案: D
错误分析:完犊子了,忘了宏定义是在编译前执行,先执行的替换操作然后运行的代码,直接计算成了 5812=480了。
分析:根据宏定义本身的性质,在编译前进行代码的替换,也就是说表达式会变成 5 * 4+4 * 6+6 = 50。(直接替换)