导航:首页 > 程序命令 > 程序员c面试问题

程序员c面试问题

发布时间:2023-02-04 15:10:45

A. c++经典面试题及答案

1. C++的类和C里面的struct有什么区别?

struct成员默认访问权限为public,而class成员默认访问权限为private

2. 析构函数和虚函数的用法和作用

析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。

虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性

3. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

1) 全局变量的作用用这个程序块,而局部变量作用于当前函数

2) 前者在内存中分配在全局数据区,后者分配在栈区

3) 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在

4) 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用

4. 有N个大小不等的自然数(1–N),请将它们由小到大排序.要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。

void sort(int e[], int n)

{

int i;

int t;

for (i=1; i {

t = e[e[i]];

e[e[i]] = e[i];

e[i] = t;

}

}

5. 堆与栈的去区别

A. 申请方式不同

Stack由系统自动分配,而heap需要程序员自己申请,并指明大小。

B. 申请后系统的响应不同

Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常

Heap:当系统收到程序申请时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点从空间结点链表中删 除,并将该结点的空间分配给程序。另外,大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,以便于delete语句正确释放空间。而且,由于 找到的堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表。

C. 申请大小限制的不同

Stack:在windows下,栈的大小是2M(也可能是1M它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

Heap:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

D. 申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

E. 堆和栈中的存储内容

栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器 中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开 始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的.头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

6. 含参数的宏与函数的优缺点

宏: 优点:在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高

缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。

函数: 优点:没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。

缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高

PS:宏与内联函数的区别

内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是;

不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)

7. Windows程序的入口是哪里?写出Windows消息机制的流程

Windows程序的入口是WinMain()函数。

Windows应用程序消息处理机制:

A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中

B. 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息,取出消息后,应用程序可以对消息进行一些预处理。

C. 应用程序调用DispatchMessage,将消息回传给操作系统。

D. 系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。

8. 如何定义和实现一个类的成员函数为回调函数

A.什么是回调函数?

简而言之,回调函数就是被调用者回头调用调用者的函数。

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。而该被调用函数在需要的时候,利用传递的地址调用回调函数。

回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。

B.如何定义和实现一个类的成员函数为回调函数

要定义和实现一个类的成员函数为回调函数需要做三件事:

a.声明;

b.定义;

c.设置触发条件,就是在你的函数中把你的回调函数名作为一个参数,以便系统调用

如:

一、声明回调函数类型

typedef void (*FunPtr)(void);

二、定义回调函数

class A

{

public:

A();

static void callBackFun(void) //回调函数,必须声明为static

{

cout<<"callBackFun"<

}

virtual ~A();

};

三、设置触发条件

void Funtype(FunPtr p)

{

p();

}

void main(void)

{

Funtype(A::callBackFun);

}

C. 回调函数与API函数

回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反, 他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它 通过一个函数指针来保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

B. 程序员面试经常被提到的问题

java 程序员常用面试题- -

Java程序员面试三十二问

Java程序员面试三十二问
作者:佚名 来自:未知

第一,谈谈final, finally, finalize的区别。

第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以

implements(实现)interface(接口)?

第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

第四,&和&&的区别。

第五,HashMap和Hashtable的区别。

第六,Collection 和 Collections的区别。

第七,什么时候用assert.

第八,GC是什么? 为什么要有GC?

第九,String s = new String("xyz");创建了几个String Object?

第十,Math.round(11.5)等于多少? Math.round(-11.5)等于多少?

第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

第十二,sleep() 和 wait() 有什么区别?

第十三,Java有没有goto?

第十四,数组有没有length()这个方法? String有没有length()这个方法?

第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?

它们有何区别?

第十七,给我一个你最常见到的runtime exception.

第十八,error和exception有什么区别?

第十九,List, Set, Map是否继承自Collection接口?

第二十,abstract class和interface有什么区别?

第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是

synchronized?

第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体

类(concrete class)?

第二十三,启动一个线程是用run()还是start()?

第二十四,构造器Constructor是否可被override?

第二十五,是否可以继承String类?

第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它

方法?

第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行

,什么时候被执行,在return前还是后?

第二十八,编程题: 用最有效率的方法算出2乘以8等于几?

第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对



第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后

的结果,那么这里到底是值传递还是引用传递?

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

第三十二,编程题: 写一个Singleton出来。

以下是答案

第一,谈谈final, finally, finalize的区别。

final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父

类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,

可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能

读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally?再异常处理时提供 finally

块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入

finally 块(如果有的话)。

finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去

之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是

在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执

行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以

implements(实现)interface(接口)?

匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口

,由另一个内部类实现。

第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套

类最大的不同就在于是否有指向外部的引用上。具体可见http:

//www.frontfree.net/articles/services/view.asp?id=704&page=1

注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2

不能从一个static内部类的一个对象访问一个外部类对象

第四,&和&&的区别。

&是位运算符。&&是布尔逻辑运算符。

第五,HashMap和Hashtable的区别。

都属于Map接口的类,实现了将惟一键映射到特定的值上。

HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。

Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步

的。

第六,Collection 和 Collections的区别。

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

Collection是个java.util下的接口,它是各种集合结构的父接口。

第七,什么时候用assert。

断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为

false,那么系统会报告一个 AssertionError。它用于调试目的:

assert(a > 0); // throws an AssertionError if a <= 0

断言可以有两种形式:

assert Expression1 ;
assert Expression1 : Expression2 ;

Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。

断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:

javac -source 1.4 Test.java

要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。

可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。

不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参

数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任

何方式改变程序的状态。

第八,GC是什么? 为什么要有GC? (基础)。

GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收

集,可以调用下面的方法之一:

System.gc()
Runtime.getRuntime().gc()

第九,String s = new String("xyz");创建了几个String Object?

两个对象,一个是"xyx",一个是指向"xyx"的引用对象s。

第十,Math.round(11.5)等于多少? Math.round(-11.5)等于多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为

s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱

sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。

这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更

高的优先级,(b)正在运行的线程因为其它原因而阻塞。

wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对

象进入等待状态,直到被唤醒或等待时间到。

第十三,Java有没有goto?

Goto?java中的保留字,现在没有在java中使用。

第十四,数组有没有length()这个方法? String有没有length()这个方法?

数组没有length()这个方法,有length的属性。
String有有length()这个方法。

第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类

之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其

父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子

类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或

有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改

变返回值的类型。

第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它

们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相

等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的

内容和类型相配的话,返回真值。

第十七,给我一个你最常见到的runtime exception。

ArithmeticException, ArrayStoreException, BufferOverflowException,

BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException,

CMMException, , DOMException, EmptyStackException,

IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException,

IllegalStateException, ImagingOpException, IndexOutOfBoundsException,

MissingResourceException, NegativeArraySizeException, NoSuchElementException,

NullPointerException, ProfileDataException, ProviderException, RasterFormatException,

SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException,

UnsupportedOperationException

第十八,error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能

处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

第十九,List, Set, Map是否继承自Collection接口?

List,Set是

Map不是

第二十,abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基

本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而

可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象

静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代

之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的

接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量

。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即

将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。

由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类

型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是

synchronized?

都不能

第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类

(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类

必须有明确的构造函数。

第二十三,启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由

JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

第二十四,构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

第二十五,是否可以继承String类?

String类是final类故不可以继承。

第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它

方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行

,什么时候被执行,在return前还是后?

会执行,在return前执行。

第二十八,编程题: 用最有效率的方法算出2乘以8等于几?

有C背景的程序员特别喜欢问这种问题。

2 << 3

第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code。

第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后

的结果,那么这里到底是值传递还是引用传递?

是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数

的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int

、 short、 char 或者 byte。long,string 都不能作用于swtich。

第三十二,编程题: 写一个Singleton出来。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

一般Singleton模式通常有几种种形式:

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,

在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}

第二种形式:

public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。

一般认为第一种形式要更加安全些

第三十三 Hashtable和HashMap

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许

还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为

contains方法容易让人引起误解。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,

不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

C. c#面试问题及答案

c#面试问题及答案

c#面试问题及答案(一)

以下哪些可以作为接口成员?(多选) ( ABDE )

A.方法B.属性C.字段D.事件E.索引器

F.构造函数G.析构函数

.以下关于ref和out的描述哪些项是正确的?(多选) (ACD)

A.使用ref参数,传递到ref参数的参数必须最先初始化。

B.使用out参数,传递到out参数的参数必须最先初始化。

C.使用ref参数,必须将参数作为ref参数显式传递到方法。

D.使用out参数,必须将参数作为out参数显式传递到方法。

.“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述?(B)

A.public B.protected C.internal D.protected internal

16.class Class1

{

private static int count = 0;

static Class1()

{

count++;

}

public Class1()

{

count++;

}

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

请问,o1.Count的值是多少?( C )

A.1 B.2 C.3 D.4

.abstract class BaseClass

{

public virtual void MethodA()

{

}

public virtual void MethodB()

{

}

}

class Class1: BaseClass

{

public void MethodA(string arg)

{

}

public override void MethodB()

{

}

}

class Class2: Class1

{

new public void MethodB()

{

}

}

class MainClass

{

public static void Main(string[] args)

{

Class2 o = new Class2();

Console.WriteLine(o.MethodA());

}

}

请问,o.MethodA调用的是: ( A )

A.BaseClass.MethodAB.Class2.MethodA

C.Class1.MethodAD.都不是

.请叙述属性与索引器的区别。

属性 索引器

通过名称标识。 通过签名标识。

通过简单名称或成员访问来访问。 通过元素访问来访问。

可以为静态成员或实例成员。 必须为实例成员。

属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表。

属性的 set 访问器包含隐式 value 参数。 除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。

请叙述const与readonly的区别。

每一个class至多只可以定义一个static构造函数,并且不允许增加访问级别关键字,参数列必须为空。

为了不违背编码规则,通常把static数据成员声明为private,然后通过statci property提供读写访问。

const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。

const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全评估。

const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。

readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作推迟到运行期进行。

readonly 关键字与 const 关键字不同:const 字段只能在该字段的声明中初始化。readonly

字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly

字段可用于运行时常数。

readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。

您需要创建一个ASP.NET应用程序,公司考虑使用Windows身份认证。

所有的用户都存在于AllWin这个域中。您想要使用下列认证规则来配置这个应用程序:

a、匿名用户不允许访问这个应用程序。

b、所有雇员除了Tess和King都允许访问这个应用程序。

请问您应该使用以下哪一个代码段来配置这个应用程序?( A )

A. 〈authorization〉

〈deny users=”allwin ess, allwinking”〉

〈allow users=”*”〉

〈deny users=”?”〉

〈/authorization〉

B. 〈authorization〉

〈allow users=”*”〉

〈deny users=”allwin ess, allwinking”〉

〈deny users=”?”〉

〈/authorization〉

C. 〈authorization〉

〈deny users=”allwin ess, allwinking”〉

〈deny users=”?”〉

〈allow users=”*”〉

〈/authorization〉

D. 〈authorization〉

〈allow users=”allwin ess, allwinking”〉

〈allow users=”*”〉

〈/authorization〉

E.〈authorization〉

〈allow users=”*”〉

〈deny users=”allwin ess, allwinking”〉

〈/authorization〉

您要创建一个显示公司员工列表的应用程序。您使用一个DataGrid控件显示员工的列表。您打算修改这个控件以便在这个Grid的Footer显示员工合计数。请问您应该怎么做?(

C? )

A.重写OnPreRender事件,当Grid的Footer行被创建时显示合计数。

B.重写OnItemCreated事件,当Grid的Footer行被创建时显示合计数。

C.重写OnItemDataBound事件,当Grid的Footer行被创建时显示合计数。

D. 重写OnLayout事件,当Grid的Footer行被创建时显示合计数。

.您要创建ASP.NET应用程序用于运行AllWin公司内部的Web站点,这个应用程序包含了50个页面。您想要配置这个应用程序以便当发生一个HTTP代码错误时它可以显示一个自定义的错误页面给用户。您想要花最小的代价完成这些目标,您应该怎么做?(多选)(

CD )

A.在这个应用程序的Global.asax文件中创建一个Application_Error过程去处理ASP.NET代码错误。

B.在这个应用程序的Web.config文件中创建一个applicationError节去处理ASP.NET代码错误。

C.在这个应用程序的Global.asax文件中创建一个CustomErrors事件去处理HTTP错误。

D.在这个应用程序的Web.config文件中创建一个CustomErrors节去处理HTTP错误。

E.在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET 代码错误。

F. 在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET HTTP错误。

您的公司有一个DB Server,名为AllWin,其上装了MS SQLSERVER

2000。现在需要您写一个数据库连接字符串,用以连接AllWin上SQL

SERVER中的一个名为PubBase实例的Test库。请问,应该选择下面哪一个字符串?( B )

A.“Server=AllWin;Data Source=PubBase;Initial Catalog=Test;Integrated

Security=SSPI”

B.“Server= AllWin;Data Source=PubBase;Database=Test;Integrated Security=

SSPI”

C.“Data Source= AllWin PubBase;Initial Category=PubBase;Integrated

Security= SSPI”

D.“Data Source= AllWin PubBase;Database=Test;Integrated Security=

SSPI”

您为AllWin公司创建了一个ASP.NET应用程序。这个应用程序调用一个 Xml Web Service。这个 Xml Web Service

将返回一个包含了公司雇员列表的DataSet对象。请问您该如何在这个程序中使用这个 Xml Web Service?( ? )

A.在“引用”对话框的'.Net标签中选择 System.Web.Services.dll。

B.在“Web引用”对话框中输入这个 XML Web service 的地址。

C.在您的 Global.asax.cs 中添加一条 using 语句并指定这个 XML Web service 的地址。

D.在您的 Global.asax.cs 中写一个事件处理器导入这个 Xml Web Service 相应的 .wsdl 和 .disco

文件。

.您要创建一个ASP.NET应用程序在DataGrid控件中显示一个经过排序的列表。产品数据被存放于一个名为PubBase的Microsoft

SQL Server

数据库。每个产品的主键是ProctID,Numeric型并且每个产品有一个字母描述字段,名为ProctName。您使用一个SqlDataAdapter对象和一个SqlCommand对象通过调用一个存储过程从数据库中获取产品数据。您将SqlCommand对象的CommandType属性设置为CommandType.StoredProcere,并将它的CommandText属性设置为procProctList。您成功的获取了一个DataTable对象,其中是已经按ProctID降序排列的产品列表。您打算显示以相反的字母顺序排列的ProctName,请问该怎么做?

( B )

A. 将SqlCommand对象的CommandType属性修改为CommandType.Text,将CommandText属性修改为”SELECT

* FROM procProctList ORDER BY ProctName

DESC”。然后将这个DataTable对象绑定到DataGrid控件。

B. 创建一个基于这个DataTable对象的新的DataView并将这个DataView的Sort属性设置为“ProctName

DESC”。然后将这个DataView对象绑定到DataGrid控件。

C. 将DataGrid控件的AllowSorting属性设置为True,并将DataGridColumn的SortExpression属性设置为

“ProctName DESC”.以显示ProctName。然后将这个DataTable对象绑定到DataGrid控件。

D. 将DataTable对象的DisplayExpression属性设置为 “ORDER BY ProctName

DESC”.。然后将这个DataTable对象绑定到DataGrid控件。

.C#代码实现,确保windows程序只有一个实例(instance)

///〈summary〉

///应用程序的主入口点。

///〈/summary〉

[STAThread]

staticvoid Main()

{

//防止程序多次运行

if(!OneInstance.IsFirst(“GetPayInfo“))

{

MessageBox.Show (“警告:程序正在运行中!

请不要重复打开程序!可在右下角系统栏找到!“,“程序错误提示:“,MessageBoxButtons.OK,MessageBoxIcon.Stop);

return;

}

Application.Run(new Form1());

}

// ******************* 防止程序多次执行 **************************

publicabstractclass OneInstance

{

///〈summary〉

///判断程序是否正在运行

///〈/summary〉

///〈param name=“appId“〉程序名称〈/param〉

///〈returns〉如果程序是第一次运行返回True,否则返回False〈/returns〉

publicstaticbool IsFirst(string appId)

{

bool ret=false;

if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero)

{

CreateMutex(IntPtr.Zero,0,appId);

ret=true;

}

return ret;

}

[DllImport(“Kernel32.dll“,CharSet=CharSet.Auto)]

privatestaticextern IntPtr OpenMutex(

uint dwDesiredAccess, // access

int bInheritHandle, // inheritance option

string lpName // object name

);

[DllImport(“Kernel32.dll“,CharSet=CharSet.Auto)]

privatestaticextern IntPtr CreateMutex(

IntPtr lpMutexAttributes, // SD

int bInitialOwner, // initial owner

string lpName // object name

);

}

简述 private、protected、public、internal 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public :

公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。

写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键, 注意:ID可能不是连续的。)

select top 10 * from A where id not in (select top 30 id from A)

解2: select top 10 * from A where id 〉 (select max(id) from (select top 30

id from A )as A)

c#面试问题及答案(二)

1, 请你说说.NET中类和结构的区别?

答:结构和类具有大体的语法,但是结构受到的限制比类要多。结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数。结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是应用类型,改变其变量的值会改变其原值。申明结构用Struck关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用。与类不同,结构的实例化可以不使用New关键字。类可以实现接口。

2, 死锁的必要条件?怎么克服?

答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。

3, 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?

答:接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。

4, 构造器Constructor是否可以被继承?是否可以被Override?

答:Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).

5, 当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法?

答:不可以,一个对象的方法只能由一个线程访问。

6, 用最有效的方法算出等已8对于几?

答:2<<3.

7, C#是否可以对内存直接进行操作?

答:这个问题比较难回答,也是个很大的问题。但是可以这样问答。C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针的,在用的时候需要在前边加unsafe,,在.net中使用了垃圾回收机制(GC)功能,它替代了程序员,不过在C#中不可以直接使用finalize方法,而是在析构函数中调用基类的finalize()方法。

8, Error和Exception有是区别?

答:error表示恢复不是不可能,但是很困难,exception表示一种实际或实现问题,它表示程序运行正常不可以发生的。

9, 谈谈final,finally,finallize的区别?

答:final用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承。

Finally是异常处理语句结构中,表示总是执行的部分。

Finallize表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。

10, HashMap和Hashtable区别?

答:HashMap是Hashtable的轻量级实现,非线程安全的实现他们都实现了map接口,主要区别是HashMap键值可以为空null,效率可以高于Hashtable。

11,Collection和Collections的区别?

答:Collection是集合类的上级接口,Collections是针对集合类的一个帮助类,它提供一系列静态方法来实现对各种集合的搜索,排序,线程安全化操作。

12,C#中委托是什么?事件是不是一种委托?

答:委托是一种安全的类似与函数指针,但是她比指针要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。事件是一种消息机制,它是一种委托,委托不带方法体。

13,Override, Overload,的区别?

答:Override是重写的意思,它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同。

Overload是重载是意思,它也表示重写基类的方法,但是只要方法名相同,别的可以不同。

14,在一个BS结构中需要传递变量值时,不能使用session,coolke,application,你有几中方法?

答:this.server.Transfer,Querystring.

15, C#种索引器实现过程,是否只能根据数字索引?

答:不是的,可以是任意类型。

16,New有种用法?

答:有3种,第一种是,实例化如:New Class()

第二种是,public new 隐藏基类的方法

第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。

17,任何把一个Array复制到Arraylist中?

答:Foreach (object o in Array), ArrayList.Add (0)

等有好多中种方法。自己想。

18,概述反射和序列化?

答:反射:要给发射下一个定义还是比较难的,这里先说说我的理解。反射提供了封装程序集,模块和类型对象,可以用反射动态地创建类型的实例,将类型绑定到现有对象,或者从现有对象类型里获取类型,然后调用类型的方法或访问字段和属性。

序列化:将对象转换为另一种媒介传输的格式过程。如,序列化一个对象,用Http通过internet在客户端和服务器之间传递该对象,在另一端用反序列化从该流中重新得到对象。

19,Const和ReadOnly?

答:Const用来申明编程时申明常量,ReadOnly用来申明运行时常量。

20,UDP和TCP连接有和异同?

答:TCP是传输控制协议,提供的是面向连接的,是可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行TCP连接之后才能传输数据。TCP提供超时重拨,检验数据功能。UDP是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。

21,进程和线程分别该怎么理解?

答:进程是比线程大的程序运行单元,都是由操作系统所体会的系统运行单元,一个程序中至少要有一个进程,有一个进程中,至少要有一个线程,线程的划分尺度要比进程要小,进程拥有独立的内存单元,线程是共享内存,从而极大的提高了程序的运行效率同一个进程中的多个线程可以并发执行。

22,ASP.NET页面之间传递值的几种方式?

答:QueryString,session,cookies,application,server.Transfer,respose.redictor.

23. 什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?

答:应用程序域:就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。

托管代码:使用CLR编译语言编辑器开发编写的代码就叫托管代码。

装箱和拆箱:是把值类型转换为引用类型的过程,是隐式的,相反的过程就是拆箱,是显式的。

CTS是公共类型系统,CLS是公共语言规范,CLR公共语言运行库。

强类型系统:每个变量和对象都必须具有申明类型。

24. 值类型和引用类型的区别?

答:值类型的值是存放在堆栈中的,改变其值,不改变变量原有的值,而引用类型的值是存放在栈中的,其引用的地址是存放在堆栈中的,改变其值也就改变了变量原有的值。值类型不允许包含null值,然而可空类型可以将null赋值给值类型l。

25. ASP.net的身份验证方式有哪些?

答:windows,forms,passport

26. 解释一下UDDI、WSDL的意义及其作用?

答:UDDI是统一描述集成协议,是一套基于Web的,分布式的,为WEB服务提供的信息注册的实现标准规范,同时为也是为企业本身提供的Web服务注册以让别的企业能够发现并访问的协议标准。提供了基于标准的规范,用于描述和发现服务,还提供了一组基于因特网的实现。

WSDL这是一个基于XML的描述WEB服务的接口。

27. 什么是SOAP?

答:是简单访问协议。是在分布式环境中,交换信息并实现远程调用的协议。是一个基于XML的协议。使用SOAP,可以不考虑任何传输协议,但通常还是HTTP协议,可以允许任何类型的对象或代码,在任何平台上,以任一种语言相互通信。它是一种轻量级协议。

28. 如何部署一个ASP.net页面?

答:vs2003,vs2005里边都有发表机制,vs2003可以发布然后在复制部署。

Vs2005可以直接部署到对应的位置。

29. 如何理解.net中的垃圾回收机制?

答:.NET中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。

30. 面向对象的三大基本原则?

答:封装,继承,多态。

;

D. 程序员人品面试题及答案,HR必备!

在我们招聘技术的时候,如果只是一个面试官面试,通常会遇到,面试管徇私舞弊,类似狗眼看人低,或者遇到高手心存嫉妒不愿招聘此人的情况,从而剔除掉面试的人才,无法有效招聘到公司所需的人。

如何避免面试人员的徇私舞弊,就至关重要,我们统长可以通过加试的流程,或者加面的流程来规避这种事情,通常情况下,我们也可以通过笔试+面试+面试2的流程进行,这样的环节越多,面试官徇私舞弊的问题就越少,对于重要的岗位我们依然要综合考虑清晰,不能让人品差的人混入。

1.排挤或者拉帮结派,在公司内部制造不和睦的情景。

2.影响公司的正常运营,还可能存在贪污腐败像闲。

3.可以吃回扣的岗位,尤其是采购会给公司造成重大的损失。

对此我总结和个人的经验,整理如下的10个人品测试题,每小题10分共100分,同样的您可以和技术题混合在一起对求职者进行这样的笔试。

如果A是您的直属领导,当遇到了紧急情况,且你正在忙手头要紧事,需要你的协助或者帮助时你会怎么做?( )

A.尽力而为 B.手上工作忙,会建议找别人 C.我没有必要帮助他人 D.放下手头要紧的事,去协助领导

答案:B

解析:作为领导,和下属都属于公司员工,没有谁更加需要帮助,只有自己的工作职责,和同事之间的互帮互助行为,二遇到这种事,应是优先做好的自己的事,再去帮助他人,选A的人是属于,阿谀奉承拍马屁的类型,选C的人是极度理性,且规规矩矩的人,选D的人是属于,斜度个人工作职责的行为。

如果A是您的直属领导,他今天搬家,告诉你去他家里帮忙,他这种行为属于?( )

A.徇私舞弊 B.私事公办 C.小气 D.欺负员工

答案:B

解析:作为领导,搬家时个人私事,不能要求任何的员工帮忙,且给钱也不行,这种行为属于私事公办。

直属的领导,再一次工作失误后,果断甩锅下属,且指责有续,领导的这种行为是否属于正常范畴,遇到这种的事情,领导最好应该怎么做?

简答题:两问,行为和怎么做。

在公共场所,因为琐事辱骂他人或者领导,这种行为属于什么行为,是否违法,能否维权?

简答题:三问,行为、违法和如何维权,主要考的求职者对法律和道德的认知。

当你下班途中,遇到一个摔倒的老人,这附近有很多碰瓷的传闻,且没有摄像头和路人,这时候你会怎么做?

A.默默路过,并报警。 B.先报警,然后扶起老人 C.录视频,且报警,扶起老人 D.回去叫人

答案:C

解析:只有C是最好的处理方式,且能体现出这位求职者的心思缜密。

如果以后你面试新人,遇到一个能力特别强的人,但没有学历,且人说话很冲,工作能力完全过关,你会向领导反应录取他嘛?()

A.不会,没学历 B.可能对我有影响,拒绝录用 C.继续等待其他合适人选 D.和领导与同事商议后录用

答案:D

解析:
选A的人可以看出这不是一个好的员工。公司是一个商业组织,目的是为了盈利,能力强的人往往求之不得,不能因为学历问题剔除。

选B的人可以看出这是一个小气,且人品和眼界都很低的员工,建议直接pass,后续对公司的发展也不好。

选C的人可以看出是个负责任的员工,会选择继续等待更合适的人选。

在你身上发生了一件事,并不是丑闻,也不是坏事,就是一件很平常的事情,这时你会觉得?()

A.自己是焦点 B.不想去上班 C.自己丢人了 D.散布的这个人真可恶 E.平平淡淡

答案:E

解析:有心理疾病的人,才会觉得自己是焦点,才会有负面情绪。

如果你是个技术大牛,且领导要求你必须教导其他人,你会怎么做?()

A.热心是不需要强迫的,会不代表一定要交

B.不听从领导的话

C.要求公司给予,教导他人的费用。

D.接受领导的要求去教人。

答案:C

解析:技术是自己的,属于个人,不属于公司,且教不教不需要强制,强制属于违法行为,懂得不代表义务教导,这属于行为绑架的行为。

领导一直强制你做事,且必须你做,出了事就甩锅给你,你会怎么做?()

A.辞职不干 B.向更高领导举报 C.果断拒绝 D.顶撞领导

答案:B A

解析:有这样爱甩锅的公司领导,也不是什么好公司,在这里工作不是勾心斗角就是你争我夺,故此B和A都是对的。

假如你遇到困难,你不想得到别人的帮助,但是就是有人要帮你,这种行为属于什么行为?()

A.强人所难 B.太过热心 C.不考虑其他人感受 D.不尊重我的主观意图

答案:A B C D

解析:这是多选题,都对,别人不需要那么就应该尊重别人,即使是送黄金,也会有人不需要的时候,不需要而自以为是强迫别人接受,就属于强人所难,不考虑其他人感受,不尊重个人主观意图。

E. C语言笔试或面试一般会问到什么问题

既然是面试,一定要提前准备,最好准备一套自我介绍,包括对IT行业的看法之类,面试官经常会问这些问题。

由于c语言是程序员工作语种的其中1个,所以对于程序员这个工种,还是有一些具体的注意事项:

第一、基础很重要,不要生疏了。

不管应聘什么开发岗位,基础永远是最重要的。IT业不停地在炒作新概念,昨天是SOA,今天是云计算。我们永远不知道明天流行什么,但是只要有踏实的基础,辅以较好的学习能力,要跟上步伐也不会太难。所以绝大多数公司都会特别看重应聘人员的基础能力,比如编程语言本身的特性、基本的算法和数据结构、进程间通信等等,毕竟这些具体技术问题有客观的答案,而且在各具体行业都是相通的。
工作三年以上的人,往往都习惯了“拷贝+修改”式的工作,用不到的基础知识基本上都忘掉了,一到应聘的时候就难免眼高手低,总是抓不住机会。
而事实上,技术基础即便是遗忘了,也是可以很快捡起来的。如果求职者确实忘了很多基础知识,那么参加面试的前夜,花点时间把大学里的课本再翻出来看看吧。似乎很土的方法,但确实是有效的。

第二、要关注技术前沿。

不管做任何工作,如果只顾着低头做事,而不晓得抬头看天。那么不管做多久,自身的水平总是停留在毕业时的水平;如果基础又忘记了太多,那还不如毕业生。
关注技术前沿,并不是要求跟进每一个新技术,而只需关注目前主流媒体经常宣传的一些新技术、新思想。关注这些技术前沿的动向,并能与自己从事的工作联系起来作一些深入思考,那么这是向面试官宣扬求职者的学习能力的一种好办法。

第三、小公司比较看重知识的广度,大公司更看重知识的深度。

如果求职业想去一些小公司工作,那么由于他们人少,分工没那么细,所以用人单位大多喜欢知识面广的应聘者——求职者会听到更多的“怎么做”。对于应聘这样的公司,求职者可以着重培养知识的广度,比如做网站后台开发,最好也能js、css、apache、mysql都懂一些,能独自搭建一套完整的网站,这样去很多小公司难度都不太大。但是由于个人的精力总是有限的,所以要注意不要铺得太开,重点还是在后台开发本身。
而大公司由于分工比较明细,所以往往更喜欢考量重点知识面的深度——求职者会听到更多的“为什么”。所以平常解决问题时,不要光搜索一把解决了就完了,还需要仔细研究各种问题的来龙去脉,并能分析总结,将这些收获系统化、理论化。
当然,广度和深度的需求不是绝对的,一个优秀的开发人员应该对至少一到两个专业领域有着深入的了解,并熟悉其他相关领域,也就是所谓的一专多能。

第四、良好的简历设计可以为你的应聘加分。

社会应聘的简历往往比校园应聘的简历写得随意,因为有工作经验的人往往认为面试官会更看重他的工作经验,而不是简历格式。其实不然。
大多数简历只会出现在面试官面前10秒到1分钟不等。这个短短的时间内,如何让求职者脱颖而出?这个方面有很多的攻略,我只说重点建议,不解释原因。
一是简历要突出优势,而不是描述经历。比如出身名校、就职过名企、参与过着名项目、拿过大奖,这些比较客观的优势要重点突出。如果求职者没有UI的功底,那么简单地放大加粗也可以达到效果。当然有些公司只接受文本型简历,那就设法加一些特殊符号吧。
二是技术简历减少模糊化的语句,最好能数字化。例如项目代码量,维护的数据量,网站的访问量,请求平均耗时等等。
三是简历要能结合应聘岗位做一些匹配的修改。撇开招聘网站通用的简历不谈,如果求职者明确对一个特定公司的特定岗位投出简历,那么求职者有必要把跟对应岗位无关的内容弱化,并强化跟其业务相关的内容。如果实在行业差别太大,那么表达几句对其行业的见解和兴趣也是可以的。

第五、要有积极的沟通意识。

优秀的面试官会激励应聘者讲他原先工作的内容,并从而评估出应聘者的能力水平。但隔行如隔山,绝大多数面试官会慢慢将问题引向自己熟悉的领域——这往往又是应聘者不太熟悉的领域。这就要求应聘者能积极分析面试官的兴趣点,并将自己相近的特长表现出来。
如果跟面试官有了意见冲突,也尽量不要再同一个问题上纠缠。那也许是故意制造的陷阱——看看求职者的团队意识。应聘者需要明白的是,在面试场合中不要妄图“战胜”面试官,即便是碰上一个期望“战胜”应聘者的面试官。

第六、要有良好的表达能力。

没有哪个面试官喜欢啰啰嗦嗦说了半天还是没说到点子上的应聘者,所以要尽量简明扼要地回答问题,除非面试官确实表现出对具体细节的兴趣。 回答问题时注意面试官的情绪变化,一旦他表现出任何想打断的意愿,立即一句话结束这个话题。有些比较复杂的问题,可以先思考十到二十秒钟,因为一旦开口就没有思考的时间,话多的人不容易收住话题。
跟学校考试不一样,大多数主观性问题并不要求应聘者一二三四说得滴水不漏,能说到大部分关键点就是可以的了。另外注意,各种技术术语不要搞混了。搞不清楚的理论概念,不如不说。免得面试官听到个术语就拉出来穷追猛打,把自己问挂。

第七、自信。

大多数做技术的,平时都信心满满,一到应聘的时候却总觉得自己不懂的东西还太多。回答问题时声音太小,或者畏畏缩缩用很多“可能”“也许”“大概”。这个不一定影响求职者的录用,但是不自信的表现无疑会影响在跟HR谈薪水时候的议价能力。所以,无论如何,应聘的时候表现得轻松镇定一些,还是很有好处的。
当然,自信和自大之间往往只有一线之差。千万小心,不要过度地表现自信搞成了自大,因为HR往往对这一点非常敏感。如果求职者只是要谨慎地表现自信的话,只要回答问题时面带微笑就够了。
最后需要特别提醒的是,以上种种其实只不过是应聘时的技巧和注意点而已。职业规划需要有长远的眼光和坚持不懈的学习。台上一分钟,台下十年功。真正的实力还是要在平时工作和学习中进行积累。

F. 面试C++ 程序员,什么样的问题是好问题

作者:陈硕
链接:http://www.hu.com/question/20184857/answer/24537006
来源:知乎
着作权归作者所有,转载请联系作者获得授权。

对于应届生:

标准库各容器的基本操作的复杂度。标准库算法的复杂度,例如 std::sort() 的平均复杂度、最坏复杂度(答 O(N^2) 和 O(N log N) 都算对),最坏情况什么时候出现。

标准库各容器(deque 除外)的数据结构(标准党勿喷,主流 STL 实现的数据结构都差不多),以及 vector 的容量增长方式。如果回答得特别好,还可以补充问为什么 vector::push_back() 的复杂度是分摊之后的 O(1),作为加分。
出一道使用 lower_bound / upper_bound 能轻松解决的简单算法题;或者实现 set_intersection() 或 set_union() 或 merge();或者实现 word count,统计每个单词出现的次数(最多十几行代码),如果有时间,输出时再按出现次数排序。

对于社招,补充问:

迭代器失效。(不要求记住所有的场景,但要有这个概念,其实知道数据结构的话不难推理。)

标准库的线程安全性。
自动化对象生命期管理,智能指针,循环引用,weak_ptr。

list 的 insert()/erase() 与 vector 相比哪个快。(这个不是那么简单。)
关于什么是好的面试题,多说几句我的看法:
面试官向谁负责。通常应聘者会面试几轮,收集多个面试官的 feedback,交给 hire manager 或 hire committee 决定是否录用。也就是说面试官无权单独决定是否录用这个候选人。在此前提下,面试官的任务是收集足够多的有效信息(包括面试题、答案、答题过程等等),供 hire manager 或 hire committee 决断。因此,面试题要有说服力。应聘者答上了这道面试题,能说明什么,如果没答上来,又能说明什么。不符合这一要求的不是好题目。

难度与区分度。难度定位在“一个合格的 C++ 程序员应该掌握的基本知识”,是招能用 C++ 干活的人,不是招标准控或语言律师。所有人都能做出来和所有人都做不出来的题目,没有区分度,不是好题目。所有应聘者都能通过或者所有应聘者都被刷掉的面试官也不是好面试官。
公平性与可重复性。技术面试题应该有比较公认的正确答案,怎么样算答得好,不仅由面试官一个人做出判断,hire manager 和 hire committee 也能重复这一判断。一套好题目,能起到筛选多个面试者的作用,比如“眼前这个应聘者的回答与过去六个月里的应聘者相比,处于前 10 % 的位置”,这就是不错的客观标杆。

G. 嵌入式开发—C语言面试题

嵌入式开发—C语言面试题

随着医疗电子、智能家居、物流管理和电力控制等方面的不断风靡,嵌入式系统利用自身积累的底蕴经验,重视和把握这个机会,想办法在已经成熟的平台和产品基础上与应用传感单元的结合,扩展物联和感知的支持能力,发掘某种领域物联网应用。下面是关于嵌入式开发—C语言面试题,希望大家认真阅读!

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在这想看到几件事情:

1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)

2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。

3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) <= (B) (A) : ))

这个测试是为下面的目的而设的:

1). 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2). 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3). 懂得在宏中小心地把参数用括号括起来

4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

least = MIN(*p++, b);

3. 预处理器标识#error的目的是什么?

如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种

问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)

4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1) { }

一些程序员更喜欢如下方案:

for(;;) { }

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的

基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。

第三个方案是用 goto

Loop:

...

goto Loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Data declarations)

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

人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。

但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道

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

Static

6. 关键字static的作用是什么?

这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

Const

7.关键字const是什么含意?

我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.

如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:

1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

Volatile

8. 关键字volatile有什么含意 并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3). 多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1). 一个参数既可以是const还可以是volatile吗?解释为什么。

2). 一个指针可以是volatile 吗?解释为什么。

3). 下面的函数有什么错误:

int square(volatile int *ptr)

{ return *ptr * *ptr;

} 下面是答案:

1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)

{ int a,b;

a = *ptr;

b = *ptr;

return a * b;

} 由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)

{ int a;

a = *ptr;

return a * a;

}

位操作(Bit manipulation)

9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

对这个问题有三种基本的反应

1). 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。

2). 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。

3). 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1<<3)

static int a;

void set_bit3(void)

{ a |= BIT3;

} void clear_bit3(void)

{ a &= ~BIT3;

} 一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa55;

一个较晦涩的方法是:

*(int * const)(0x67a9) = 0xaa55;

即使你的.品味更接近第二种方案,但我建议你在面试时使用第一种方案。

中断(Interrupts)

11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)

{ double area = PI * radius * radius;

printf(" Area = %f", area);

return area;

}

这个函数有太多的错误了,以至让人不知从何说起了:

1). ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。

2). ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。

3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

4). 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

代码例子(Code examples)

12 . 下面的代码输出是什么,为什么?

void foo(void)

{ unsigned int a = 6;

int b = -20;

(a+b > 6) puts("> 6") : puts("<= 6");

}

这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。

13. 评价下面的代码片断:

unsigned int zero = 0;

unsigned int compzero = 0xFFFF;

/*1's complement of zero */

对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:

unsigned int compzero = ~0;

这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。

到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧…

动态内存分配(Dynamic memory allocation)

14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?

这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:下面的代码片段的输出是什么,为什么?

char *ptr;

if ((ptr = (char *)malloc(0)) == NULL)

puts("Got a null pointer");

else

puts("Got a valid pointer");

这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer”。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。

Typedef

15. Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:

#define dPS struct s *

typedef struct s * tPS;

以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?

这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:

dPS p1,p2;

tPS p3,p4;

第一个扩展为

struct s * p1, p2;

上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。

晦涩的语法

16. C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?

int a = 5, b = 7, c;

c = a+++b;

这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:

c = a++ + b;

因此, 这段代码持行后a = 6, b = 7, c = 12。

如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题

What will print out?

main()

{ char *p1=“name”;

char *p2;

p2=(char*)malloc(20);

memset (p2, 0, 20);

while(*p2++ = *p1++);

printf(“%sn”,p2);

}

Answer:empty string.

What will be printed as the result of the operation below:

main()

{ int x=20,y=35;

x=y++ + x++;

y= ++y + ++x;

printf(“%d%dn”,x,y);

}

Answer : 5794

What will be printed as the result of the operation below:

main()

{ int x=5;

printf(“%d,%d,%dn”,x,x< <2,x>>2);

}

Answer: 5,20,1

What will be printed as the result of the operation below:

#define swap(a,b) a=a+b;b=a-b;a=a-b;

void main()

{ int x=5, y=10;

swap (x,y);

printf(“%d %dn”,x,y);

swap2(x,y);

printf(“%d %dn”,x,y);

}

int swap2(int a, int b)

{ int temp;

temp=a;

b=a;

a=temp;

return 0;

}

Answer: 10, 5

10, 5

What will be printed as the result of the operation below:

main()

{ char *ptr = ” Cisco Systems”;

*ptr++; printf(“%sn”,ptr);

ptr++;

printf(“%sn”,ptr);

}

Answer:Cisco Systems

isco systems

What will be printed as the result of the operation below:

main()

{ char s1[]=“Cisco”;

char s2[]= “systems”;

printf(“%s”,s1);

} Answer: Cisco

What will be printed as the result of the operation below:

main()

{ char *p1;

char *p2;

p1=(char *)malloc(25);

p2=(char *)malloc(25);

strcpy(p1,”Cisco”);

strcpy(p2,“systems”);

strcat(p1,p2);

printf(“%s”,p1);

}

Answer: Ciscosystems

The following variable is available in file1.c, who can access it?:

static int average;

Answer: all the functions in the file1.c can access the variable.

WHat will be the result of the following code?

#define TRUE 0 // some code

while(TRUE)

{

// some code

}

Answer: This will not go into the loop as TRUE is defined as 0.

What will be printed as the result of the operation below:

int x;

int modifyvalue()

{ return(x+=10);

} int changevalue(int x)

{ return(x+=1);

}

void main()

{ int x=10;

x++;

changevalue(x);

x++;

modifyvalue();

printf("First output:%dn",x);

x++;

changevalue(x);

printf("Second output:%dn",x);

modifyvalue();

printf("Third output:%dn",x);

}

Answer: 12 , 13 , 13

What will be printed as the result of the operation below:

main()

{ int x=10, y=15;

x = x++;

y = ++y;

printf(“%d %dn”,x,y);

}

Answer: 11, 16

What will be printed as the result of the operation below:

main()

{ int a=0;

if(a==0)

printf(“Cisco Systemsn”);

printf(“Cisco Systemsn”);

}

Answer: Two lines with “Cisco Systems” will be printed.

;

H. 程序员技术面试中,当面试官问“你还有什么问题”,应该怎么回答

应聘程序员,在技术面试的时候,结束时面试官通常会问一个问题:你还有什么问题吗?众所周知,面对这个问题不能直接说没问题了,因为这是你掰回一句或者加深认可的好机会。但是下面这4个问题在技术面试时最好不要问:

1、“我能拿多少工资?”

注意你参加的是技术面试,尽量不要问跟技术不相关的东西,这在技术面试的过程中是一个减分项。一般面试官如果对你有兴趣会主动地询问你的理想薪资。

2、“五险一金有没有?交通补助有没有?”

这个问题一般不建议去问,这些问题在技术面试后人事会主动告诉你或者自己主动去询问人事都可以的,但是在技术面试官面前,问这些跟他本职工作没有关系的问题会让面试官觉得不耐烦。

3、“公司经常加班吗?”

作为开发人员加班的情况肯定是会有的,只是经不经常可能得看公司的实际情况。在面试时问这个问题你可能只是想了解一下公司的加班情况,但却会让面试官质疑你的抗压能力,给面试留下不好的印象。

4、“您觉得我今天能面上吗?”

有些小伙伴可能急于求职,所以会有些迫切地问这个问题。如果面试官觉得你有希望肯定会给你一些信号,如果面试官不看好你,问这个问题可能让双方都比较尴尬。

上面说了4个不该问的问题, 那在面试官问“你还有什么问题吗?”时应该问一些什么问题?

再次点题,在技术面试最好提跟技术相关或跟本职工作相关的的问题。第一,可以问一下关于产品的问题,比如一下产品用的什么技术,想回去了解一下,或者关于一些新的技术比如大数据、spring boot公司是怎么用的。这些问题既能让面试官有兴趣回答,又能展现你的知识面。

I. C++经典面试问题

C++经典面试问题

C++经典面试问题分享

1,关于动态申请内存

答:内存分配方式三种:

(1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。

全局变量,static变量。

(2)在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,

函数执行结束时这些存储单元自动被释放。

栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)用malloc或new申请内存之后,应该立即检查指针值是否为NULL.防止使用指针值为NULL的内存,

不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。避免数组或指针的下标越界,

特别要当心发生“多1”或者“少1”操作。动态内存的申请与释放必须配对,防止内存泄漏。

用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。从堆上分配,亦称动态内存分配。

程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。

动态内存的生存期由程序员决定,使用非常灵活。(int *pArray; int MyArray[6]; pArray = &MyArray[0];)

如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,

判断指针是否为NULL,如果是则马上用return语句终止本函数,

或者马上用exit(1)终止整个程序的运行,为new和malloc设置异常处理函数。

2,C++指针攻破

答案:指针是一个变量,专门存放内存地址,特点是能访问所指向的内存

指针本身占据了4个字节的长度

int **ptr; //指针的类型是 int **

int (*ptr)[3]; //指针的类型是 int(*)[3]

int *(*ptr)[4]; //指针的类型是 int *(*)[4]

ptr++:指针ptr的值加上了sizeof(int)

ptr+=5:将指针ptr的值加上5*sizeof(int)

指针的赋值:

把一个变量的地址赋予指向相同数据类型的指针变量( int a; int *ip; ip=&a; )

把一个指针变量的值赋予指向相同类型变量的另一个指针变量(int a; int *pa=&a; int *pb; pb=pa; )

把数组的首地址赋予指向数组的指针变量(int a[5],*pa; pa=a; 也可写为:pa=&a[0];)

如果给指针加1或减1 ,实际上是加上或减去指针所指向的数据类型大小。

当给指针加上一个整数值或减去一个整数值时,表达式返回一个新地址。

相同类型的两个指针可以相减,减后返回的整数代表两个地址间该类型的实例个数。

int ** cc=new (int*)[10]; 声明一个10个元素的数组,数组每个元素都是一个int *指针,

每个元素还可以单独申请空间,因为cc的类型是int*型的指针,所以你要在堆里申请的话就要用int *来申请;

int ** a= new int * [2];//申请两个int * 型的空间

a[0] = new int[4];////为a的第一个元素申请了4个int 型空间,a[0] 指向了此空间的首地址处

a[1] = new int[3];//为a的第二个元素又申请了3个int 型空间,a[1]指向了此空间首地址处

指针数组初始化赋值:

一维指针开辟空间:char *str;int *arr; scanf("%d",&N);

str=(char*)malloc(sizeof(char)*N);

arr=(int*)malloc(sizeof(int)*N);

二维指针开辟空间:int **arr, i; scanf("%d%d",&row,&col);

arr=(int**)malloc(sizeof(int)*row);

for(i=0;i

arr[i]=(int*)malloc(sizeof(int)*col);

结构体指针数组,例如typedef struct{ char x; int y; }Quan,*QQuan;

定义一个结构体指针数组如:QQuan a[MAX]

for(i=0;i

{

a[i]=(QQuan)malloc(sizeof(Quan));

memset(a[i],0,sizeof(Quan));

}

指针数组赋值

float a[]={100,200,300,400,500};

float *p[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

char *units[1000];

char get_unit[250];

for(int i=0;i

scanf("%s", get_unit); strcpy(units[i],get_unit);}

3,复杂指针解析:

(1)int (*func)(int *p);

(*func)()是一个函数,func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。

(2)int (*func)(int *p, int (*f)(int*));

func是一个指向函数的'指针,这类函数具有int *和int (*)(int*)这样的形参。形参int (*f)(int*),f也是一个函数指针

(3)int (*func[5])(int *p);

func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

(4)int (*(*func)[5])(int *p);

func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

(5)int (*(*func)(int *p))[5];

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

注意:

需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。

应该用typedef来对声明逐层,分解,增强可读性,例如对于声明:int (*(*func)(int *p))[5];

这样分解:typedef int (*PARA)[5]; typedef PARA (*func)(int *);

例如:int (*(*func)[5][6])[7][8];

func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。

typedef int (*PARA)[7][8];

typedef PARA (*func)[5][6];

例如:int (*(*(*func)(int *))[5])(int *);

func是一个函数指针,这类函数的返回值是一个指向数组的指针,

所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。

typedef int (*PARA1)(int*);

typedef PARA1 (*PARA2)[5];

typedef PARA2 (*func)(int*);

4,函数指针详解

答:函数指针是指向一个函数入口的指针

一个函数指针只能指向一种类型的函数,即具有相同的返回值和相同的参数的函数。

函数指针数组定义:void(*fun[3])(void*); 相应指向类A的成员函数的指针:void (A::*pmf)(char *, const char *);

指向外部函数的指针:void (*pf)(char *, const char *); void strcpy(char * dest, const char * source); pf=strcpy;

5,野指针

答:“野指针”是很危险的,if语句对它不起作用。“野指针”的成因主要有两种:

(1)指针变量没有被初始化。指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

char *p = NULL; char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL

(3)指针操作超越了变量的作用范围。所指向的内存值对象生命期已经被销毁

6,引用和指针有什么区别?

答:引用必须初始化,指针则不必;引用初始化以后不能改变,指针可以改变其指向的对象;

不存在指向空值的引用,但存在指向控制的指针;

引用是某个对象的别名,主要用来描述函数和参数和返回值。而指针与一般的变量是一样的,会在内存中开辟一块内存。

如果函数的参数或返回值是类的对象的话,采用引用可以提高程序的效率。

7,C++中的Const用法

答:char * const p; // 指针不可改,也就说指针只能指向一个地址,不能更改为其他地址,修饰指针本身

char const * p; // 所指内容不可改,也就是说*p是常量字符串,修饰指针所指向的变量

const char * const p 和 char const * const p; // 内容和指针都不能改

const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值,

传递过来的参数在函数内不可以改变,参数指针所指内容为常量不可变,参数指针本身为常量不可变

在引用或者指针参数的时候使用const限制是有意义的,而对于值传递的参数使用const则没有意义

const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。

const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。

const修饰类的成员变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。static const 的成员需在声明的地方直接初始。

const修饰类的成员函数,则该成员函数不能修改类中任何非const成员。一般写在函数的最后来修饰。

在函数实现部分也要带const关键字.

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用

使用const的一些建议:在参数中使用const应该使用引用或指针,而不是一般的对象实例

const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;

const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;

不要轻易的将函数的返回值类型定为const;除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

8,const常量与define宏定义的区别

答:(1) 编译器处理方式不同。define宏是在预处理阶段展开,生命周期止于编译期。

只是一个常数、一个命令中的参数,没有实际的存在。

#define常量存在于程序的代码段。const常量是编译运行阶段使用,const常量存在于程序的数据段.

(2)类型和安全检查不同。define宏没有类型,不做任何类型检查,仅仅是展开。

const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同。define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)

9,解释堆和栈的区别

答:1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

由系统自动分配。声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 。

只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域,栈的大小是2M。

如果申请的空间超过栈的剩余空间时,将提示overflow。

栈由系统自动分配,速度较快。但程序员是无法控制的。

函数调用时,第一个进栈的是主函数中后的下一条指令,的地址,然后是函数的各个参数。

在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,需要程序员自己申请,并指明大小,在c中malloc函数

在C++中用new运算符。首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,

另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

堆是向高地址扩展的数据结构,是不连续的内存区域。而链表的遍历方向是由低地址向高地址。

堆的大小受限于计算机系统中有效的虚拟内存。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便

一般是在堆的头部用一个字节存放堆的大小。

10,论述含参数的宏和函数的优缺点

(1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换

(2)函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开是在编译时进行的,在展开时不进行

内存分配,不进行值得传递处理,没有“返回值”概念

(3)对函数中的形参和实参都要定义类型,类型要求一致,如不一致则进行类型转换。而宏不存在类型问题

(4)调用函数只可得到一个返回值,而用宏则可以设法得到几个结果

(5)实用宏次数多时,宏展开后源程序变长,没展开一次源程序增长,函数调用则不会

(6)宏替换不占用运行时间,只占编译时间,而函数调用占用运行时间

11,C++的空类,默认产生哪些类成员函数?

答:class Empty

{

public:

Empty(); //缺省构造函数

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

~Empty(); //虚构函数

Empty& operator(const Empty& ) //赋值运算符

Empty& operator&(); //取址运算符

const Empty* operator&() const; // 取址运算符 const

}

12,谈谈类和结构体的区别

答:结构体在默认情况下的成员都是public的,而类在默认情况下的成员是private的。结构体和类都必须使用new创建,

struct保证成员按照声明顺序在内存在存储,而类不保证。

13,C++四种强制类型转换

答:(1)const_cast

字面上理解就是去const属性,去掉类型的const或volatile属性。

struct SA{ int k}; const SA ra;

ra.k = 10; //直接修改const类型,编译错误 SA& rb = const_cast(ra); rb.k = 10; //可以修改

(2)static_cast

主要用于基本类型之间和具有继承关系的类型之间的转换。用于指针类型的转换没有太大的意义

static_cast是无条件和静态类型转换,可用于基类和子类的转换,基本类型转换,把空指针转换为目标类型的空指针,

把任何类型的表达式转换成void类型,static_cast不能进行无关类型(如非基类和子类)指针之间的转换。

int a; double d = static_cast(a); //基本类型转换

int &pn = &a; void *p = static_cast(pn); //任意类型转换为void

(3)dynamic_cast

你可以用它把一个指向基类的指针或引用对象转换成继承类的对象

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

基类必须有虚函数,保持多态特性才能用dynamic_cast

只能在继承类对象的指针之间或引用之间进行类型转换

class BaseClass{public: int m_iNum; virtual void foo(){};};

class DerivedClass:BaseClass{public: char* szName[100]; void bar(){};};

BaseClass* pb = new DerivedClass();

DerivedClass *p2 = dynamic_cast(pb);

BaseClass* pParent = dynamic_cast(p2);

//子类->父类,动态类型转换,正确

(4)reinterpreter_cast

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

主要是将一个类型的指针,转换为另一个类型的指针

不同类型的指针类型转换用reinterpreter_cast

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

int DoSomething(){return 0;};

typedef void(*FuncPtr)(){};

FuncPtr funcPtrArray[10];

funcPtrArray[0] = reinterpreter_cast(&DoSomething);

14,C++函数中值的传递方式有哪几种?

答:函数的三种传递方式为:值传递、指针传递和引用传递。

15,将“引用”作为函数参数有哪些特点

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

对象的一个别名来使用,所以在被调函数中形参的操作就是对相应的目标对象的操作

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作,当参数数据较大时,引用

传递参数的效率和所占空间都好

(3)如果使用指针要分配内存单元,需要重复使用“*指针变量名”形式进行计算,容易出错且阅读性较差。

;

J. 程序员面试问题及答案

程序员面试问题及答案

程序员是从事程序开发、维护的专业人员。我整理的程序员面试问题及答案,希望大家喜欢!

1、两柱香问题

题目:有两柱不均匀的香,每柱香燃烧完需要1个小时,问:怎样用两柱香切出一个15分钟的时间段?这个题的重点就是怎么切。

解答:将甲香的一头点着,将乙香的两头点着,当乙香燃烧完时,说明已经过了半个小时,同时也说明甲香也正好燃烧了一半,此时,将甲香的另一头点着,从此时起到甲香完全烧完,正好15分钟。

2、灯管问题

在房里有三盏灯,房外有三个开关,在房外看不见房内的情况,你只能进门一次,你用什么方法来区分那个开关控制那一盏灯?

解答:打开一盏灯10分钟,关掉,打开第二盏,进去看看哪盏亮,摸摸哪盏热,热的是第一个打开的开关开的,亮的是第二个开关开的',另一个就是第三个。

3、两位盲人问题

他们都各自买了两对黑袜和两对白袜,八对袜了的布质、大小完全相同,而每对袜了都有一张商标纸连着。两位盲人不小心将八对袜了混在一起。 他们每人怎样才能取回黑袜和白袜各两对呢?

答案:每一对分开,一人拿一只,因为袜子不分左右脚的;

4、果冻问题

你有一桶果冻,其中有黄色,绿色,红色三种,闭上眼睛,同时抓取两个果冻。抓取多少个就可以确定你肯定有两个同一颜色的果冻?

答案:2次4个!

5、喝啤酒问题

假如每3个空啤酒瓶可以换一瓶啤酒,某人买了10瓶啤酒,那么他最多可以喝到多少瓶啤酒?

答案:喝完10瓶后用9个空瓶换来3瓶啤酒(喝完后有4个空瓶)喝完这三瓶又可以换到1瓶啤酒(喝完后有2个空瓶),这时他有2个空酒瓶,如果他能向老板先借一个空酒瓶,就凑够了3个空瓶可以换到一瓶啤酒,把这瓶喝完后将空瓶还给老板就可以了。

所以他最多可以喝10+3+1+1=15瓶

6、三人住旅馆

有三个人去住旅馆,住三间房,每一间房$10元,于是他们一共付给老板$30,第二天,老板觉得三间房只需要$25元就够了于是叫小弟退回$5给三位客人,谁知小弟贪心,只退回每人$1,自己偷偷拿了$2,这样一来便等于那三位客人每人各花了九元,于是三个人一共花了$27,再加上小弟独吞了不$2,总共是$29。可是当初他们三个人一共付出$30那么还有$1呢?

答案:他们所消费的27元里已经包括小弟的2元了,再加退还的3元=30元。这种题一定不要乱了阵脚,根据一条思路做:这30元现在的分布是:老板拿25元,伙计拿2元,三人各拿1元,正好!

7、三筐苹果问题

有三筐水果,一筐装的全是苹果,第二筐装的全是橘子,第三筐是橘子与苹果混在一起。筐上的标签都是骗人的,(就是说筐上的标签都是错的)你的任务是拿出其中一筐,从里面只拿一只水果,然后正确写出三筐水果的标签。

答案:从标着“混合”标签的筐里拿一只水果,就可以知道另外两筐装的是什么水果了。

分析:从混合的拿出一个来,如果是苹果,而贴苹果的筐里有可能是橘子和混合,如果是混合,说明贴橘子的筐里是橘子,不成立(因为前提说了,每个标签都是错的)。所以贴苹果的筐里是橘子,则贴橘子的筐里是混合。

8、汽车加油问题

一辆载油500升的汽车从A开往1000公里外的B,已知汽车每公里耗油量为1升,A处有无穷多的油,其他任何地点都没有油,但该车可以在任何地点存放油以备中转,问从A到B最少需要多少油

解答:严格证明该模型最优比较麻烦,但确实可证,大胆猜想是解题关键。题目可归结为求数列an=500/(2n 1) n=0,1,2,3......的和Sn什么时候大于等于1000,解得n>6当n=6时,S6=977.57,所以第一个中转点离起始位置距离为1000-977.57=22.43公里.所以第一次中转之前共耗油22.43*(2*7 1)=336.50升此后每次中转耗油500升,所以总耗油量为7*500 336.50=3836.50升。

9、两个人猜数问题

教授选出两个从2到9的数,把它们的和告诉学生甲,把它们的积告诉学生乙,让他们轮流猜这两个数, 甲说:“我猜不出”, 乙说:“我猜不出”, 甲说:“我猜到了”, 乙说:“我也猜到了”, 问这两个数是多少?

解答:3和4。设两个数为n1,n2,n1> =n2,甲听到的数为n=n1 n2,乙听到的数为m=n1*n2,证明n1=3,n2=4是唯一解。证明:要证以上命题为真,不妨先证n=7

1)必要性:

i) n> 5 是显然的,因为n <4不可能,n=4或者n=5甲都不可能回答不知道

ii) n> 6 因为如果n=6的话,那么甲虽然不知道(不确定2 4还是3 3)但是无论是2,4还是3,3乙都不可能说不知道(m=8或者m=9的话乙说不知道是没有道理的)

iii) n <8 因为如果n> =8的话,就可以将n分解成 n=4 x 和 n=6 (x-2),那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要条件是x=6即n=10,那样n又可以分解成8 2,所以总之当n> =8时,n至少可以分解成两种不同的合数之和,这样乙说不知道的时候,甲就没有理由马上说知道。以上证明了必要性。

2)充分性

当n=7时,n可以分解成2 5或3 4

显然2 5不符合题意,舍去,容易判断出3 4符合题意,m=12,证毕

于是得到n=7 m=12 n1=3 n2=4是唯一解。

10、猴子吃香蕉问题

一个小猴子边上有100 根香蕉,它要走过50 米才能到家,每次它最多搬50 根香蕉,每走1 米就要吃掉一根,请问它最多能把多少根香蕉搬到家里。

解答:设 小猴从0 走到50, 到A 点时候他可以直接抱香蕉回家了, 可是到A 点时候他至少消耗了3A 的香蕉( 到A, 回0, 到A), 一个限制就是小猴只能抱50 只香蕉, 那么在A 点小猴最多49 只香蕉.100-3A=49, 所以A=17. 这样折腾完到家的时候香蕉剩100-3A-(50-A)=50-2A=16.


;
阅读全文

与程序员c面试问题相关的资料

热点内容
冒险岛什么服务器好玩 浏览:541
如何在服务器上做性能测试 浏览:793
命令序列错 浏览:257
javaif的条件表达式 浏览:576
手机app上传的照片怎么找 浏览:531
云服务器面临哪些威胁 浏览:746
c语言各种编译特点 浏览:177
路由器多种加密方法 浏览:604
程序员阻止电脑自动弹出定位 浏览:168
如何做服务器服务商 浏览:761
su剖切命令 浏览:726
devc编译背景 浏览:211
学习单片机的意义 浏览:51
音频算法AEC 浏览:911
加密货币容易被盗 浏览:82
苹果平板如何开启隐私单个app 浏览:704
空调压缩机一开就停止 浏览:528
如何下载虎牙app 浏览:847
日语年号的算法 浏览:955
dev里面的编译日志咋调出来 浏览:298