当前位置:文档之家› C++笔试题

C++笔试题

C++笔试题
C++笔试题

1.new、delete、malloc、free关系

delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

2.delete与 delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在MoreEffectiveC++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operatordelete来释放内存。”delete与New配套,delete []与new []配套

MemTest*mTest1=newMemTest[10];

MemTest*mTest2=newMemTest;

int*pInt1=newint[10];

int*pInt2=newint;

delete[]pInt1; //-1-

delete[]pInt2; //-2-

delete[]mTest1;//-3-

delete[]mTest2;//-4-

在-4-处报错。

这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针简单来说,用new分配的内存用delete删除用new[]分配的内存用delete[]删除delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

3.请说出static和const关键字尽可能多的作用

解答:

static关键字至少有下列n个作用:

(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声

明它的模块内;

(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类

的static成员变量。

const关键字至少有下列n个作用:

(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进

行初始化,因为以后就没有机会再去改变它了;

(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;

(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:

const classA operator*(const classA& a1,const classA& a2);

operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:classA a, b, c;

(a * b) = c; // 对a*b的结果赋值

操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。

剖析:

惊讶吗?小小的static和const居然有这么多功能,我们能回答几个?如果只能回答1~2个,那还真得闭关再好好修炼修炼。

这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入,没有一定的知识广度和深度,不可能对这个问题给出全面的解答。大多数人只能回答出static和const关键字的部分功能。

4.C++类型转换总结。

const_cast

去掉类型的const或volatile属性。

Eg.

struct SA {

int i;

};

const SA ra;

//ra.i = 10; //直接修改const类型,编译错误

SA &rb = const_cast(ra);

rb.i = 10;

static_cast

类似于C风格的强制转换。无条件转换,静态类型转换。用于:

1.基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指

针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)

2.基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型

(如非基类和子类)指针之间的转换。

3.把空指针转换成目标类型的空指针。

4.把任何类型的表达式转换成void类型。

5.static_cast不能去掉类型的const、volitale属性(用const_cast)。

Eg.

1int n = 6;

2double d = static_cast(n); // 基本类型转换

3int *pn = &n;

4double *d = static_cast(&n) //无关类型指针转换,编译错误

5void *p = static_cast(pn); //任意类型转换成void类型

dynamic_cast

有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):

1.安全的基类和子类之间转换。

2.必须要有虚函数。

3.相同基类不同子类之间的交叉转换。但结果是NULL。

Eg.

class BaseClass {

public:

int m_iNum;

virtual void foo(){}; //基类必须有虚函数。保持多台特性才能使用dynamic_cast

};

class DerivedClass: public BaseClass {

public:

char *m_szName[100];

void bar(){};

};

BaseClass* pb = new DerivedClass();

DerivedClass *pd1 = static_cast(pb); //子类->父类,静态类型转换,正确但不推荐

DerivedClass *pd2 = dynamic_cast(pb); //子类->父类,动态类型转换,正确

BaseClass* pb2 = new BaseClass();

DerivedClass *pd21 = static_cast(pb2); //父类->子类,静态类型转换,危险!访问子类m_szName成员越界

DerivedClass *pd22 = dynamic_cast(pb2); //父类->子类,动态类型转换,安全的。结果是NULL

reinterpret_cast

仅仅重新解释类型,但没有进行二进制的转换:

1.转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。

2.在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成

一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。

3.最普通的用途就是在函数指针类型之间进行转换。

4.很难保证移植性。

Eg.

1int doSomething(){return0;};

2typedef void(*FuncPtr)(); //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为void

3FuncPtr funcPtrArray[10]; //10个FuncPtrs指针的数组让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:

4

5funcPtrArray[0] = &doSomething;// 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray

6funcPtrArray[0] = reinterpret_cast(&doSomething); //不同函数指针类型之间进行转换

总结

去const属性用const_cast。

基本类型转换用static_cast。

多态类之间的类型转换用daynamic_cast。

不同类型的指针类型转换用reinterpret_cast。

5.C++有哪些性质(面向对象特点)

封装,继承和多态。

在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特性,它不仅支持系统的可重用性,而且还有利于提高系统的可扩充性;消息传递可以实现发送一个通用的消息而调用不同的方法;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。

6. 变量的声明和定义有什么区别?

声明:告诉编译器有这样一个类型的变量会被使用,但编译器不会分配内存给他。

定义:分配具体的内存给变量。

7.子类析构时要调用父类的析构函数吗?

析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数JA V A无析构函数深拷贝和浅拷贝。

8.关于Sizeof

以下为WindowsNT下的32位C++程序,请计算sizeof的值

Void Func (char str[100])

{

Sizeof( str ) = ?

}

Void *p = malloc( 100 );

Sizeof ( p ) = ?

解答: sizeof( str ) = 4; // 指针的sizeof为4.

sizeof( p ) = 4; // 指针的sizeof为4.

某32位系统下, C++程序,请计算sizeof 的值

#include

#include

void Foo ( char str[100] )

{

printf("sizeof(str)=%d n", sizeof(str) );

}

main()

{

char str[] = "https://www.doczj.com/doc/a35500650.html,";

char *p1 = str ;

int n = 10;

void *p2 = malloc( 100 );

printf("sizeof(str)=%d n", sizeof(str) );

printf("sizeof(p1)=%d n", sizeof(p1) );

printf("sizeof(n)=%d n", sizeof(n) );

printf("sizeof(p2)=%d n", sizeof(p2) );

Foo(str);

}

答:(1)17 (2)4 (3) 4 (4)4 (5)4

9.什么是“引用”?申明和使用“引用”要注意哪些问题?

答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

10.将“引用”作为函数参数有哪些特点?

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函

数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

11.在什么时候需要使用“常引用”?

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符&引用名=目标变量名;

例1

Inta ;

const int &ra=a;

ra=1; //错误

a=1; //正确

例2

string foo( );

void bar(string & s);

那么下面的表达式将是非法的:

bar(foo( ));

bar("hello world");

原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const。

12.关联、聚合(Aggregation)以及组合(Composition)的区别?

涉及到UML中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:

class A {...} class B { A* a; .....}

而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:实现的形式是:

class A{...} class B{ A a; ...}

参考文章:https://www.doczj.com/doc/a35500650.html,/Lily/archive/2006/02/23/6860.html

https://www.doczj.com/doc/a35500650.html,/document/viewdoc/?id=422

13.String类的实现

已知类String的原型为:

class String

{

public:

String(constchar *str = NULL);// 普通构造函数

String(const String &other); // 拷贝构造函数

~ String(void); // 析构函数

String & operate =(const String &other);// 赋值函数

private:

char *m_data;// 用于保存字符串

};

请编写String的上述4个函数。

//普通构造函数

String::String(constchar *str)

{

if(str==NULL)

{

m_data = newchar[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断

*m_data = '\0';

}

else

{

int length = strlen(str);

m_data = newchar[length+1]; // 若能加 NULL 判断则更好

strcpy(m_data, str);

}

}

// String的析构函数

String::~String(void)

{

delete [] m_data; // 或delete m_data;

}

//拷贝构造函数

String::String(const String &other) // 得分点:输入参数为const型

{

int length = strlen(other.m_data);

m_data = newchar[length+1]; //加分点:对m_data加NULL 判断

strcpy(m_data, other.m_data);

}

//赋值函数

String & String::operate =(const String &other) // 得分点:输入参数为const类型

{

if(this == &other) //得分点:检查自赋值

return *this;

delete [] m_data; //得分点:释放原有的内存资源

int length = strlen( other.m_data );

m_data = newchar[length+1]; //加分点:对m_data加NULL 判断

strcpy( m_data, other.m_data );

return *this; //得分点:返回本对象的引用

}

能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了

C++基本功的60%以上!

在这个类中包括了指针类成员变量m_data,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,

这既是对C++程序员的基本要求,也是《Effective C++》中特别强调的条款。

仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具备了60%以上的C++基本功!

14. strcpy& strlen& strcmp

已知strcpy函数的原型是

char *strcpy(char *strDest, const char *strSrc);

其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?--为了实现链式表达式。

#include

#include

char *strcpy(char *strDest, const char *strSrc)

{

assert((strDest!=NULL) && (strSrc !=NULL)); // 2分

char* address = strDest; // 2分

while( (*strDest++ = *strSrc++) != '\0' )// 2分

NULL;

return address ; // 2分

}

Strlen函数:

#include

#include

int strlen( const char *str ) // 输入参数const

{

assert( str != NULL ); // 断言字符串地址非0

int len = 0;

while( (*str++) != '\0' )

{

len++;

}

return len;

}

Strcmp函数:

intstrcmp(char*source,char*dest)

{

assert((source!=NULL)&&(dest!=NULL));

int i,j;

for(i=0; source[i]==dest[i]; i++)

{

if(source[i]=='' && dest[i]=='')

return 0;

else

return -1;

}

}

15.动态连接库的两种方式

1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。

2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。

16.写出下列算法的时间复杂度

(1)冒泡排序;复杂度为O(n*n)

(2)选择排序;复杂度为O(n*n)

(3)插入排序;复杂度为O(n*n)

(4)快速排序;平均时间复杂度log2(n)*n

(5)堆排序;n*log2(n)

(6)归并排序;

17.一些基础小题

1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值

int a = 4;

(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);

a = ?

答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;

改后答案依次为9,10,10,11

2. 回答下面的问题.

(1).头文件中的 ifndef/define/endif 干什么用?预处理

答:防止头文件被重复引用

(2). #include 和#include “filename.h” 有什么区别?

答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。

(3).在C++ 程序中调用被 C 编译器编译后的函数,为什么要加extern “C”声明?

答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用 C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

3.C++中为什么用模板类。

答:(1)可用来创建动态增长和减小的数据结构

(2)它是类型无关的,因此具有很高的可复用性。

(3)它在编译时而不是运行时检查数据类型,保证了类型安全

(4)它是平台无关的,可移植性

(5)可用于基本数据类型

4.程序什么时候应该使用线程,什么时候单线程效率高。

答:1.耗时的操作使用线程,提高应用程序响应

2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

3.多CPU系统中,使用线程提高CPU利用率

4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

其他情况都使用单线程。

5.winsock建立连接的主要实现步骤?

答:服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。

客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。

服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。

6.如何打印出当前源文件的文件名以及源文件的当前行号?

答案:

cout << __FILE__ ;

cout<<__LINE__ ;

__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。7.如何判断一段程序是由C 编译程序还是由C++编译程序编译的?

答案:

#ifdef __cplusplus

cout<<"c++";

#else

cout<<"c";

#endif

8.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?

应用层

表示层

会话层

运输层

网络层

物理链路层

物理层

tcp /udp属于运输层

TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。

与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。

TCP: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好

UDP: 不提供稳定的服务,包头小,开销小

18.数据声明(Data declarations)

用变量a给出下面的定义

a) 一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇

文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这

个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者

如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?

19.链表

一个链表的结点结构

struct Node

{

int data ;

Node *next ;

};

typedef struct Node Node ;

(1)已知链表的头结点head,写一个函数把这个链表逆序

Node * ReverseList(Node *head) //链表逆序

{

if ( head == NULL || head->next == NULL )

return head;

Node *p1 = head ;

Node *p2 = p1->next ;

Node *p3 = p2->next ;

p1->next = NULL ;

while ( p3 != NULL )

{

p2->next = p1 ;

p1 = p2 ;

p2 = p3 ;

p3 = p3->next ;

}

p2->next = p1 ;

head = p2 ;

return head ;

}

(2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。

Node * Merge(Node *head1 , Node *head2)

{

if ( head1 == NULL)

return head2 ;

if ( head2 == NULL)

return head1 ;

Node *head = NULL ;

Node *p1 = NULL;

Node *p2 = NULL;

if ( head1->data < head2->data )

{

head = head1 ;

p1 = head1->next;

p2 = head2 ;

}

else

{

head = head2 ;

p2 = head2->next ;

p1 = head1 ;

}

Node *pcurrent = head ;

while ( p1 != NULL && p2 != NULL)

{

if ( p1->data <= p2->data )

{

pcurrent->next = p1 ;

pcurrent = p1 ;

p1 = p1->next ;

}

else

{

pcurrent->next = p2 ;

pcurrent = p2 ;

p2 = p2->next ;

}

}

if ( p1 != NULL )

pcurrent->next = p1 ;

if ( p2 != NULL )

pcurrent->next = p2 ;

return head ;

}

(3)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求使用递归方法。

Node * MergeRecursive(Node *head1 , Node *head2)

{

if ( head1 == NULL )

return head2 ;

if ( head2 == NULL)

return head1 ;

Node *head = NULL ;

if ( head1->data < head2->data )

{

head = head1 ;

head->next = MergeRecursive(head1->next,head2);

}

else

{

head = head2 ;

head->next = MergeRecursive(head1,head2->next);

}

return head ;

}

(4)如何检查一个单向链表上是否有环?

思路:同样两个指针,一个步长为1,另一个步长为2,如果两个指针能相遇则有环。

20.排序算法

冒泡排序:算法的平均时间复杂度为O(n2),性能不是很好,但稳定性高。

voidBubbleSort(SeqList R)

{ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序

inti,j;

Boolean exchange; //交换标志

for(i=1;i

{

exchange=FALSE; //本趟排序开始前,交换标志应为假

for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描

{

if(R[j+1].key

{

R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元

R[j+1]=R[j];

R[j]=R[0];

exchange=TRUE; //发生了交换,故将交换标志置为真

}

}

if(!exchange) //本趟排序未发生交换,提前终止算法

return;

} //endfor(外循环)

} //BubbleSort

快速排序:

#include

using namespace std;

void fast_sort(int *ptr, int begin, int end)

{

int temp = *(ptr + begin);//设置初始比较基准数据

int i = begin + 1, j = end, curPosition = begin;//定义开头和结尾的I j

bool direction = false;

while(i <= j)

{

if(direction)

{

if(*(ptr + i) < temp)//如果当前数据小于基准数据那么换位置改当前位置

{

*(ptr + curPosition) = *(ptr + i);

curPosition = i;

direction = false;

}

i++;

}else//先从后到前比较数据

{

if(*(ptr + j) > temp)//如果最后一个大于基准那么最后一个数据赋值给当前基准数据的那个位置调整基准数据的位置

{

*(ptr + curPosition) = *(ptr + j);//

curPosition = j;

direction = true;

}

j--;

}

}

*(ptr + curPosition) = temp;

if(curPosition - begin > 1)//前面小的比较

fast_sort(ptr, begin, curPosition - 1);

if(end - curPosition > 1)//后面大的比较

fast_sort(ptr, curPosition + 1, end);

}

21.进程和线程

什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:

进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。同一进程中的两段代码不能够同时执行,除非引入线程。线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源要少于进程所占用的资源。进程和线程都可以有优先级。在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。

线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。

(3)线程是处理器调度的基本单位,但进程不是。

(4)二者均可并发执行。

22.C++中的class和struct的区别

从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:

(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继

承按照public继承处理;

(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。

不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:

(1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;

(2)都可以有一大堆public/private/protected修饰符在里边;

(3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:

A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。(4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。(5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。(6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。

---------------------------------------------------------------

最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关

键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

关于使用大括号初始化

class和struct如果定义了构造函数的话,都不能用大括号进行初始化

如果没有定义构造函数,struct可以用大括号初始化。

如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。

关于默认访问权限

class中默认的成员访问权限是private的,而struct中则是public的。

关于继承方式

class继承默认是private继承,而struct继承默认是public继承。

关于模版

在模版中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。

class中有个默认的this指针,struct没有。

不同点:构造函数,析构函数,this指针。

23.

24.

25.

26.

27.

28.

29.

30.

C笔试题目带答案

C笔试题目带答案 Standardization of sany group #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#

姓名:___________ 时间:___________ DCCBB AADAD 一、选择题(1*10=10) 1.如果派生类以proctected方式继承基类,则原基类的protected和public成员在派生类的访问性分别是:D A.public和public B.public和protected C.protected和public D.protected和protected 解析:通过protected方式继承基类后,原基类的私有成员不可访问,而protected和public成员均变成protected成员。 答案:D 2.有如下头文件: int F1(); static int F2(); classs CA { public: int F3();

static int F4(); }; 在所描述的函数中,具有隐含this指针的是:C A.F1 B.F2 C.F3 D.F4 本题考查的是this指针。 this指针式一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this指针。 this指针是指向对象本身的指针,它只存在于类的非静态成员中。f1,f2不是成员函数,不存在隐含指针;f4为静态成员函数,也不含有this指针;含有this指针的函数在调用时按thiscall调用约定调用。 故本题答案为C。 3.派生类的成员函数不能访问基类的:C A.共有成员和保护成员B.共有成员 C.私有成员D.保护成员 本题考查的是继承的类型。

c和c++经典笔试题及答案

C++/C经典笔试题及答案 C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。 笔试时间90分钟。请考生认真答题,切勿轻视。 一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。(10分)提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) 请写出BOOL flag 与“零值”比较的if 语句: 请写出float x 与“零值”比较的if 语句: 请写出char *p 与“零值”比较的if 语句: char str[] = “Hello” ; char *p = str ; int n = 10; 请计算 sizeof (str ) = sizeof ( p ) = sizeof ( n ) =void Func ( char str[100]) { 请计算 sizeof( str ) = } void *p = malloc( 100 );请计算 sizeof ( p ) = 1、头文件中的 ifndef/define/endif 干什么用? 2、#include 和#include “filename.h” 有什么区别? 3、const 有什么用途?(请至少说明两种) 4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加extern “C”声明? 5 // 第一个 for (i=0; i

c语言笔试题(答案)(精心整理)

笔试题 一、填空题(每个空4分,共28分) 1)struct tagABC { char name[10]; char sex; long sno; float score[4]; }*pAbc;(四字节对齐) pAbc=NULL; 那么,执行pAbc+=2;之后pAbc的值为(64 ) 2)如下代码,最终value的值是(8) int *p1,*p2; int value; p1=(int*)0×400; p2=(int*)0×408; value = p2-p1; 3)如下代码,printf的结果为(2) #include〈stdio.h〉 #include〈string.h〉 void main(void) { char acNew[20]= “\\0\0”; printf(“%d\n”,strlen(acNew)); } 4) 有如下程序段,运行该程序的输出结果是(33) main () { int y=3,x=3,z=1; printf(“%d%d\n”,(++x,y++),z+2); } 5)设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后,n的值为(2)6)struct tagAAA { Unsigned char ucId:1; Unsigned char ucPara0:2; Unsigned char ucState:6; Unsigned char ucTail:4; Unsigned char ucAvail; Unsigned char unTail2:4; Unsigned long ulData; }AAA_S 问:AAA_S在字节对齐分别为1,4情况下,占用的空间大小分别是多少?( 9)(12 )

c面试题

8.类的静态成员和非静态成员有何区别? 类的静态成员每个类只有一个,非静态成员每个对象一个 4. static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17. Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错 4、语句for( ;1 ;)有什么问题?它是什么意思? 答:和while(1)相同。

C笔试题目带答案

姓名:___________ 时间:___________ DCCBB AADAD 一、选择题(1*10=10) 1.如果派生类以proctected方式继承基类,则原基类的protected和public成员在派生类的访问性分别是:D A.public和public B.public和protected C.protected和public D.protected和protected 解析:通过protected方式继承基类后,原基类的私有成员不可访问,而protected和public 成员均变成protected成员。 答案:D 2.有如下头文件: int F1(); static int F2(); classs CA { public: int F3();

static int F4(); }; 在所描述的函数中,具有隐含this指针的是:C A.F1 B.F2 C.F3 D.F4 本题考查的是this指针。 this指针式一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this指针。 this指针是指向对象本身的指针,它只存在于类的非静态成员中。f1,f2不是成员函数,不存在隐含指针;f4为静态成员函数,也不含有this指针;含有this指针的函数在调用时按thiscall调用约定调用。 故本题答案为C。 3.派生类的成员函数不能访问基类的:C A.共有成员和保护成员B.共有成员 C.私有成员D.保护成员 本题考查的是继承的类型。

常见C笔试题目含答案完整版

常见C笔试题目含答案 HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】

1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态 virtual修饰符会被隐形继承的。private 也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。————————————————————————– 2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码) #include using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.getlin e(a,50,’\n’); for(i=0,j=strlen(a)-1;i

} //第二种 string str; cin>>str; str.replace; cout<

C语言笔试题大全

C语言笔试题大全 4. static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17. Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如

H C面试题题目

1.OSPF邻接形成过程? 首先通过HELLO报文建立邻居关系 然后通过网络类型看是否要选出DR/BDR,如果需要就根据HELLO报文里的DR优先级和routerid选出DR和BDR 通过第一个DD报文选出主从关系 然后发送LSRLSULSack报文完成同步 2.OSPF中承载完整的链路状态的包? LSU 3.链路状态协议和距离矢量协议的比较? 距离矢量是拿跳数作为COST值的衡量,链路状态协议主要是以带宽做为COST值MTU,接口稳定性 4.OSPF防环措施? SPF算法本身就是一种无环的算法,OSPF多区域时,非骨干区域只有通过骨干区域传递路由 5.OSPF是纯链路状态的协议吗? 在单区域中,OSPF是纯链路状态的协议,在多区域的情况下,区域内部是链路状态,区域间是距离矢量

6.OSPF中DR选举的意义?DR选举时的网络类型?DR和其它路由器的关系? 选举DR可以降低需要维护的邻接关系数量 只有NBMA网络和broadcast网络 7.OSPF的NSSA区域和其它区域的区别? NSSA区域和普通区域的区别是不允许4类,5类LSA的通过,但允许7类LSA的通过 NSSA区域和STUB区域的区别是NSSA是STUB的变形,允许7类LSA的注入 8.OSPF的LSA类型,主要由谁生成? 1类是所有路由器都能生成 2类是由DR生成 3类是由ABR生成 4类是由ABR生成 5类是由ASBR生成 7类是由ASBR生成 9.IBGP为什么采用全互联?不采用全互联怎么部署? BGP发布者从IBGP对等体学习到的路由不向其他IBGP对等体发布

可以采用反射和联盟 10.路由反射器的反射原则? 如果从客户机学习到的路由,反射给所有客户机和非客户机 如果从非客户机学习到的路由,仅反射给客户机,不反射给其他非客户机 从EBGP对等体学习到的路由,反射给所有客户机和非客户机 11.OSPF邻居形成过程? id、认证类型和密码、hello时间和dead时间是否一致特殊位的标记(特殊区域)两台路由器由INIT变为2-WAY 12.OSPF有几类LSA? 一共有11类LSA,常用的有7种 13.OSPF的NSSA区域与其它区域的通信方法? 14.PPP协商过程? 通过LCP报文来建立链路 如果开启验证则开始PAP和CHAP验证 通过NCP来进行网络层协商 15.OSPF没有形成FULL状态的原因?

c和c经典笔试题及答案

c和c经典笔试题及答 案 集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

C++/C经典笔试题及答案

C++/C试题??? 本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C 常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。 ???????笔试时间90分钟。请考生认真答题,切勿轻视。 一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: ????if ( n == 0 ) ????if ( n != 0 ) 1、头文件中的 ifndef/define/endif 干什么用? 2、#include?????和??#include??“filename.h” 有什么区别? 3、const 有什么用途?(请至少说明两种) 4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明? 5

已知strcpy函数的原型是 ???????char *strcpy(char *strDest, const char *strSrc); ???????其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数 strcpy (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值? 六、编写类String的构造函数、析构函数和赋值函数(25分) 已知类String的原型为: ????class String ????{ ??????public: ????????String(const char *str = NULL); // 普通构造函数????????String(const String &other);????????// 拷贝构造函数????????~ String(void);?????????????????????// 析构函数????????String & operate =(const String &other);????// 赋值函数??????private: ????????char????*m_data;????????????????// 用于保存字符串????}; ???????请编写String的上述4个函数。 C++/C试题的答案与评分标准 一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。(10

C语言面试题和答案

1.什么是编辑器,编译器,源代码,目标代码? 略 2.编写一个最简单的程序。 答案:void main(void) {} 或 void main(void) { } 3.C语言有哪两种存储数值的方式? 答案:变量和常量 4.请写出下列代码的输出内容 #include int main(void) { int a,b,c,d; a=10; b=a++; c=++a; d=10*a++; printf("b,c,d:%d,%d,%d",b,c,d); return 0; } 答:10,12,120 5. 请写出下列代码的输出内容 #include int a,b; int main(void) { a = b = 5;

/* Print them, decrementing each time. */ /* Use prefix mode for b, postfix mode for a */ printf("\nPost Pre"); printf("\n%d %d",a--,--b); printf("\n%d %d",a--,--b); printf("\n%d %d",a--,--b); printf("\n%d %d",a--,--b); printf("\n%d %d\n",a--,--b); system("PAUSE"); return 0; } 答案:5 4 4 3 3 2 2 1 1 0 6.请写出下列代码的输出内容 #include /* Initialize variables. Note that c is not less than d, */ /* which is one of the conditions to test for. */ /* Therefore, the entire expression should evaluate as false.*/ int a = 5, b = 6, c = 5, d = 1; int x; int main( void ) { /* Evaluate the expression without parentheses */ x = a < b || a < c && c < d; printf("\nWithout parentheses the expression evaluates as %d", x); /* Evaluate the expression with parentheses */ x = (a < b || a < c) && c < d; printf("\nWith parentheses the expression evaluates as %d\n", x); return 0; } 答案:Without parentheses the expression evaluates as 1 With parentheses the expression evaluates as 0 7.下面表达式的值是多少?

C笔试题_经典50题(含答案)教学提纲

uanji 内测/月考 类型:(笔试)范围:内测/月考 日期: 时长:1小时 总分数:100 分 姓名: 准考证号: 证件号码:

理论部分 注意:考试结束试卷必须交回,答案填写在答题卡上

( )关键字用于在C#中从派生类中访问基类的成员。(选一项) A、new B、super C、this D、base C#程序可以依据()来进行方法重载。(选一项) A、不同的参数个数 B、不同的参数名称 C、不同的返回值 D、不同的方法名称 C#中的方法重写使用关键字(选一项) A、override B、overload C、static D、inherit C#中关于委托,下面说法正确的是(选一项) A、委托是一种类的成员 B、委托必须定义在类中 C、定义委托需要使用delegate关键字 D、委托是一种数据类型 System.String类的()方法不能删除字符串中的空格。(选一项) A、Replace() B、Trim() C、Remove() D、EndsWith() 关于抽象类下面说法错误的是(选一项) A、抽象类可以包含非抽象方法 B、含有抽象方法的类一定是抽象类 C、抽象类不能被实例化 D、抽象类可以是密封类 关于接口的使用,说法错误的是(选一项) A、接口可以作为参数进行传递 B、接口可以作为方法的返回值 C、接口可以实例化 D、同时实现多个接口是变相实现了多重继承 下列泛型集合声明正确的是(选一项) A、List f = new List() B、List f = new List() C、List f = new List() D、List f = new List 下列关于C#索引器理解正确的是(选一项) A、索引器的参数必须是两个或两个以上 B、索引器的参数类型必须是整数型

C C 笔试题-公司招聘C笔试题

1.改错(5分) void test() { char str[10]; char* str1 = "0123456789"; strcpy(str, str1); } 2.改错(5分) void test() { char str[10], str1[10]; for( int = 0; i < 10; i++) { str = 'a'; } strcpy(str, str1); } 3.读程序,写出结果(5分) int sum(int a) { int c = 0; static int b = 3; c += 1; b += 2; return (a + b + c); } int main() { int a = 2; for(int i = 0; i < 5; i++) { printf("%d,", sum(a)); } return 0; } 4.读程序,写出结果(5分) int main() {

int a[3]; a[0] = 0; a[1] = 1; a[2] = 2; int *p, *q; p = a; q = &a[2]; int c = a[q - p]; printf("value c = %d\n", c++); printf("value c = %d\n", c); return 0; } 5.读程序,写出结果(10分,选做) #define STRCPY(a, b) strcpy(a ## _p, #b) int main() { char var1_p[20]; char var2_p[30]; strcpy(var1_p, "aaaa"; strcpy(var2_p, "bbbb"; STRCPY(var1, var2); STRCPY(var2, var1); printf("var1 = %s\n", var1_p); printf("var2 = %s\n", var2_p); return 0; } 6.(10分)不用除法(即不能使用"/"号)和库函数,计算285 / 16的商和余数, 要求效率尽量高. 7.(15分)编写字符串反转函数:strrev.要求时间和空间效率都尽量高. (测试用例:输入"abcd",输出应为"dcba" 函数原型为: char* strrev(char* dest, char* src);

c语言经典笔试题(非常全)

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) <= (B) (A) : (B)) 4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 第三个方案是用goto Loop: ... goto Loop; 5. 用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: a) int a; // An integer b) int *a; // A pointer to an integer c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int *a[10]; // An array of 10 pointers to integers f) int (*a)[10]; // A pointer to an array of 10 integers g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 6. 关键字static的作用是什么?

C笔试题(新)

姓名:日期:一,选择题 1,若有以下定义数组并初始化错误语句( A ). char a[10]={'0','1','2','3','4','5','6','7','8','9'}; A) scanf("%c",a[0]); B) scanf("%s",&a); C) printf("%c",a[3]); D) printf("%s",a); 2,以下程序输出结果为( ) #include "stdio.h" main() { int i,b,k=0; for(i=1;i<=5;i++) { b=i%2; while (b-->=0) k++; } printf("%d,%d\n",k,b); } A. 3,-1 B. 8,-1 C. 3,0 D. 8,-2 3,根据if比较语句,顺序给出VAR的类型。()if(!var) if(var==NULL) if(var==0) if ((var >= - 0.00001) && (var <= 0.00001) A. int B. BOOL C. float D. 指针 4,以下正确的描述是( )。 A) continue语句的作用是结束整个循环的执行 B) 只能在循环体内和switch语句内使用break语句 C) 在循环体内使用break语句或continue语句的作用相同 D) 从多层循环嵌套中退出时,只能使用goto语句 E) break 语句不能用于循环语句和switch语句外的任何其他语句

F) 在switch语句中使用break语句或continue语句的作用相同 G) 在循环语句中使用continue语句是为了结束本次循环,而不是终止整个循环的执行 H) 在循环语句中使用break语句是为了使流程跳出循环体,提前结束循环 5,假定在32位机器上设有以下说明和定义: typedef union { long i; int k[5]; char c; } DATE; struct data { int cat; DATE cow; double dog; } too; DATE max; 则语句printf("%d",sizeof(struct data)+sizeof(max));的执行结果是:( )。 A. 32 B. 48 C. 52 D. 64 6,下面程序输出是() #include main ( ) { char *a="1234"; fun(a); printf("\n"); } fun ( char *s) { char t; if(*s) {t = *s++; fun(s); } if(t !='\0') putchar( t ); } A) 1234 B) 4321 C)1324 D) 4231

常见C语言笔试题

C语言题库 *1 A 一个C程序的执行是从_____。 A)本程序的main函数开始,到main函数结束 B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C)本程序的main函数开始,到本程序文件的最后一个函数结束 D)本程序文件的第一个函数开始,到本程序main函数结束 *2 C 以下叙述正确的是: A)在C程序中,main函数必须位于程序的最前面 B)C程序的每行中只能写一条语句 C)C语言本身没有输入输出语句 D)在对一个C程序进行编译的过程中,可发现注释中的拼写错误 *3 D 以下叙述不正确的是。 A)一个C源程序可由一个或多个函数组成 B)一个C源程序必须包含一个main函数 C)C程序的基本组成单位是函数 D)在C程序中,注释说明只能位于一条语句的后面 *4 C C语言规定:在一个源程序中,main函数的位置。 A)必须在最开始 B)必须在系统调用的库函数的后面 C)可以任意 D)必须在最后 *5 B 一个C语言程序是由 A)一个主程序和若干子程序组成 B)函数组成 C)若干过程组成 D)若干子程序组成 *6 A 在C语言中(以16位PC机为例),5种基本数据类型的存储空间长度的排列顺序为

A)char

C语言笔试题及参考答案

C语言笔试题及参考答案-东软集团 一、选择题(共30题,每题2分,满分60分) 1、(数据结构)对图中的二叉树,按先根次序遍历得到的结点序列为B A、ABCDHEIFG B、ABDHIECFG C、HDIBEAFCG D、HIDBEFGAC 2、(数据结构)设线性表(a1,a2,a3,...,a500)中所有元素的值由小到大排列,对一个给定的值K,用二分法查找表中与K相等的元素,在查找不成功的情况下,至多需要比较 A 次。(本人拿不准) A、8 B、9 C、10 D、11 3、(数据结构)二叉树的查找有深度优先和广度优先,深度优先包括 A A、前序遍历、后序遍历、中序遍历 B、前序遍历、后序遍历、层次遍历 C、前序遍历、中序遍历、层次遍历 D、中序遍历、后序遍历、层次遍历 4、(数据结构)已知二叉树的先序序列为ABDECF,中序序列为DBEAFC,则后序序列为D A、DEBAFC B、DEFBCA C、DEBCFA D、DEBFCA 5、(数据结构)队列是一种常用的数据结构,其元素的入队与出队遵循A 原则。 A、先进先出 B、先进后出 C、随机进、随机出 D、顺序进、随机出 6、(数据结构)在数据结构中,结点及结点间的相互关系是数据的逻辑结构,数据结构按逻辑关系的不同,通常可分为两类 A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 7、(数据结构)队列是一种常用的数据结构,其元素的入队与出队遵循原则。 A、先进先出 B、先进后出 C、随机进、顺序出 D、顺序进、随机出 8、(数据结构)与单向链表相比,双向链表的优点之一是 A、更节省存储空间 B、便于进行随机访问 C、更容易访问相邻结点 D、可以省略头指针和尾指针 9、(操作系统)在文件存储设备管理中,有三类常用字的空闲块管理方法,即位图向量法,空闲块链表法和 A、级目录法 B、多级目录法 C、分区法 D、索引法 10、(操作系统)在进程管理中,当时,进程从阻塞状态变为就绪状态。 A、进程被进程调度程序选中 B、等待某一事件 C、等待事件发生 D、时间片用完 11、(操作系统)若进程P1正在运行,操作系统强行撤下P1进程所占用的CPU,让具有更高优先级的进程P2运行,这种调度方式称为 A、中断方式 B、抢占方式 C、非抢占方式 D、查询方式 12、(操作系统)I/O控制方式有多种,一般用于大型、高效的计算机系统中。

C语言笔试题

C语言笔试题 本文章共13818字,分4页,当前第1 4.static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7.引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8.描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10.什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11.堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12.什么函数不能声明为虚函数? constructor 13.冒泡排序算法的时间复杂度是什么? O(n^2) 14.写出float x 与“零值”比较的if语句。

if(x>0.000001&&x<-0.000001) 16.Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17.Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。

公司c语言笔试题

1.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。(#define MIN(A,B) ((A) <= (B) (A) : (B))) 2.用变量a给出下面的定义 a) 一个整型数(int a) b) 一个指向整型数的指针(int *a) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(int **a) d) 一个有10个整型数的数组(int a[10]) e) 一个有10个指针的数组,该指针是指向一个整型数的(int *a[10]) f) 一个指向有10个整型数数组的指针(int (*a)[10]) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(int (*a)(int)) 3.int a = 5, b = 7, c; c = a+++b; a=(6), c=(12) 4.char str[] = “Hello” ;char *p = str ;int n = 10; 请计算 sizeof (str ) = (6); sizeof ( p ) = (4) sizeof ( n ) = (4) 5. void Func ( char str[100]) { 请计算 sizeof( str ) = (4); } 6. void *p = malloc( 100 ); 请计算 sizeof ( p ) =(4) ; 7. 以下程序的输出结果是 main( ) { int k=17; printf(“%d,%o,%x \n”,k,k,k); } (17,21,11) 8. 在位运算中,操作数每右移一位,其结果相当于(操作数除以2) 9. 若x和n均是int型变量,且x和n的初值均为5,则计算表达式x+=n++ 后x的值为(10),n的值为(6) 10. 若有定义:int a[3][4]={{1,2},{0},{4,6,8,10}};则初始化后,a[1][2]得到的初值是(0),a[2][1]得到的初值是(6)。 11. 若有定义:int a=8,b=5,C;,执行语句C=a/b+0.4;后,c的值为(1) 12. 请写出下列代码的输出内容(10,12,120) #include main()

相关主题
文本预览
相关文档 最新文档