C语言
为了提高程序的运行速度,在函数中对于整型或指针可以使用()型的变量。
-
auto
-
register
-
static
-
extern
正确答案: B 你的答案: A (错误)
auto 变量类型推演,
register 建议编译器将该变量放入cpu,
static 静态变量,
extern 声明变量,常用于多文件需要使用同一变量时
通常情况下,变量的值是存取于内存之中,若使用CPU的寄存器,将局部变量值直接放于寄存器中,其存取速度远远高于对内存的存取速度,因此,使用cpu的寄存器可提高执行速率
若有说明: int a[][4]={0,0};则下面不正确的叙述是()。
- 数组 a 的每个元素都可得到初值0
- 二维数组 a 的第一维大小为1
- 因为二维数组 a 中第二维大小的值除经初值个数的商为1,故数组 a 的行数为1
- 有元素 a[0][0]和 a[0][1]可得到初值0,其余元素均得不到初值0
正确答案: D 你的答案: B (错误)
定义一个二维数组,这个数组的每一行有四个元素,一般行数是可以省略的 电脑会根据你的初始化自动计算行数。‘因为初始化只给了两个元素 所以行数为1’
请指出以下程序的错误:
void GetMemory(char **p, int num)
{
if(NULL==p && num<=0)//1
return;
*p=(char*)malloc(num);
return;
}
void main(void){
char *str=NULL;
GetMemory(&str,80); //2
if(NULL!=str){
strcpy(&str,"hello"); //3
printf(str);
}
return true; //4
}
-
1
-
2
-
3
-
4
正确答案: A C D 你的答案: A D (错误)
if(NULL==p && num<=0)//1 应该为 if(NULL==p || num<=0)
strcpy(&str,"hello"); //3 应为 strcpy(str,"hello");
return true; //4 与void冲突
下列哪些代码会调用一个DLL的 DllMain 函数
-
LoadLibraray("A.dll")
-
GetModuleHandle(0,"A.dll",&hDLL)
-
LoadLibraryEx("A.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
-
FreeLibrary(hDLL)
正确答案: A B D 你的答案: B C D (错误)
C++
下列运算符中,( )运算符在 C++ 中不能被重载。
-
&&
-
[]
-
::
-
new
正确答案: C 你的答案: C (正确)
类属关系运算符”.“、成员指针运算符”.*“、作用域运算符”::“、sizeof运算符和三目运算符”?:“以外,C++中的所有运算符都可以重载
关于SEH和c++异常处理,选项中说法错误的是( )
-
SHE主要包括终止(finally)处理和异常(exception)处理,这些都是有操作系统实现的。
-
C++异常处理try catch可以捕获程序中所有的异常,比如下面这样的代码:int *p=0x0;*p=100;只要你给他加上try catch就可以轻松处理
-
c++中也可以使用SHE,比如这样:class A { public: A(){}; ~A(){}; void test(){}; }; int _tmain(int argc, _TCHAR* argv[]) { __try{ A a; a.test();} __except(1){} }
正确答案: A 你的答案: C (错误)
SEH主要包括:
- Per-Thread类型SEH(也称为线程异常处理),用来监视某线程代码是否发生异常。
- Final类型SEH(也称为进程异常处理、筛选器或顶层异常处理),用于监视整个进程中所有线程是否发生异常。在整个进程中,该类型异常处理过程只有一个,可通过SetUnhandledExceptionFilter设置。
下面关于类和对象的描述中,错误的是:
-
类就是C语言中的结构体类型,对象就是C语言中的结构体变量
-
类和对象之间的关系是抽象和具体的关系
-
对象是类的实例,一个对象必须属于一个已知的类
-
类是具有共同行为的若干对象的统一描述体
正确答案: A 你的答案: A C (错误)
有以下程序
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> A(10);
int count = 0, n;
cout << "请输入n的值:";
cin >> n;
A.__________(n);
for (int i = 2; i <= n; i++)
if (i % 3 == 0 && i % 5 == 0) A[count++] = i;
for (i = 0; i < count; i++)
cout << A[i] << " ";
cout << endl;
}
当键盘输入20,程序的运行结果是15,请为横线处选择合适的程序( )
-
size
-
reserve
-
resize
-
length
正确答案: B C 你的答案: A C D (错误)
B reserve(n) 调用reserve(n)后,若容器的capacity<n,则重新分配内存空间,从而使得capacity等于n
C resize(n) 调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。
原来大小是10,I=15才会有A[count++]=15,所以要调整大小,而AD大小未发生变化
下面关于垃圾收集的描述哪个是错误的?
-
使用垃圾收集的程序不需要明确释放对象
-
现代垃圾收集能够处理循环引用问题
-
垃圾收集能提高程序员效率
-
使用垃圾收集的语言没有内在泄漏问题
正确答案: D 你的答案: A (错误)
答案:D 也会有内存泄露问题,例如访问资源文件,流不关闭,访问数据库等连接不关闭
java的垃圾收集机制主要针对新生代和老年代的内存进行回收,不同的垃圾收集算法针对不同的区域。所以java的垃圾收集算法使用的是分代回收。一般java的对象首先进入新生代的Eden区域,当进行GC的时候会回收新生代的区域,新生代一般采用复制收集算法,将活着的对象复制到survivor区域中,如果survivor区域装在不下,就查看老年代是否有足够的空间装下新生代中的对象,如果能装下就装下,否则老年代就执行FULL GC回收自己,老年代还是装不下,就会抛出OUtOfMemory的异常
内存泄露(Memory Leak)是指一个不再被使用的对象或者变量还在内存中占有存储空间。在C/C++语言中,内存泄露出现在开发人员忘记释放已分配的内存就会造成内存泄露。在java语言中引入垃圾回收机制,有GC负责进行回收不再使用的对象,释放内存。但是还是会存在内存泄露的问题。
内存泄露主要有两种情况:1.在堆中申请的空间没有释放。2.对象已不再被使用(注意:这里的不在被使用是指对程序来说没有用处,如数据库连接使用后没有关。但是还是存在着引用),但是仍然在内存中保留着。GC机制的引入只能解决第一种情况,对于第2种情况无法保证不再使用的对象会被释放。java语言中的内存泄露主要指第2种情况。
内存泄露的原因:1.静态集合类。如HashMap和Vector。这些容器是静态的,生命周期和程序的生命周期一致,那么在容器中对象的生命周期也和其一样,对象在程序结束之前将不能被释放,从而会造成内存泄露。2.各种连接,如数据库连接,网络连接,IO连接,不再使用时如果连接不释放容易造成内存泄露。3.***,释放对象时往往没有相应的删除***,可能会导致内存泄露。
内存溢出(OOM)是指程序在申请内存时没有足够的内存供使用,进而导致程序崩溃这是结果描述。内存泄露(Memory Leak)最终会导致内存溢出。
static 类型的变量,默认的初始化值是?()
-
0
-
空格符
-
1
-
随机变量
正确答案: A 你的答案: D (错误)
静态变量在没有显式初始化的时候会被初始化为0或者null
代码int i=3;i<<=4;i的值等于多少?()
-
40
-
110000(二进制)
-
12
-
-48
正确答案: B 你的答案: B (正确)
<<是左移运算符的意思,左移运算符是用来将一个数的各二进制位全部左移若干位。
这里可以理解为把3化为2进制,然后统一左移4位。
3的二进制比如 0011 左移4位 110000 = 48
有如下程序段:
#include "stdio.h"
class A
{
public:
A()
{
printf("1");
}
A(A &a)
{
printf("2");
}
A &operator=(const A &a)
{
printf("3");
return *this;
}
};
int main()
{
A a;
A b = a;
}
则程序输出为:
- 12
- 13
- 无法确定
- 编译出错
正确答案: A 你的答案: B (错误)
A a,定义一个对象,毫无疑问调用构造函数
A b=a,这是定义了对象b,且以a对b进行初始化,这个时候需要调用拷贝构造函数。
如果写成A a;A b;b=a;则是调用后面重载的赋值函数,这种情况应该输出113。
这个题主要考察赋值和初始化的区别。
下列代码片段的时间复杂度是多少:
function(int n)
{
if(n == 1) return;
for(int i = 1 ; i <= n ; ++i) {
for(int j = 1 ; j <= n ; ++j) {
printf("*");
break;
}
}
}
- O(n)
- O(n^2)
- O(1)
- O(2n)
正确答案: A 你的答案: B (错误)
第二个for循环只执行一次,break只跳出一层循环