产品资料

程序员笔试题收集汇总(一)

发布时间 : 2018-07-17 17:14

笔试题集,全凭自己的理解。
相关文章:
程序员笔试试题集(1)

程序员笔试试题集(二)

程序员笔试试题集(三)

1。以下 C 在代码,不属于未定义的行为_
A: Int i=0;i=(i++);
B: char *p=”hello”;p[1]=’E’;
C: char *p=”hello”;char ch=*p++;
D: int i=0;printf(“%d%d\n”,i++,i–);
E: 所有未定义的行为
F: 两者都不是未定义的行为。
正确答案: C
解析:C语言中未定义的行为(未定义的) 行为)是指C语言标准的行为。。同时,标准也从没要求编译器判断未定义行为,所以这些行为有一个编译器来处理它们自己。,不同的编译器可能产生不同的结果。,或者如果程序调用未定义的行为,它可以成功编译。,即使它开始运行,也没有错误。,只在另一个系统上,甚至没有在另一个日期运行。当一个未定义行为的实例发生时,正如语言标准所说,任何事情都可能发生。,也许什么也没发生。。
所以,避免未定义行为,这是明智的决定。。本文将介绍几种未定义的行为。,同时,欢迎读者指正和补充。。
1。同一运算符中操作数的个数、||、?和,不包括运营商)

例如:x = f()+g(); //错误
f()和G()谁首先计算编译器的决定,如果函数f或g改变了另一个有趣的变量的值,然后,x的结果可能取决于这两个函数的顺序。。
参考: C语言(第二版) P43
每个参数的求值顺序为2。功能

例如: printf(“%d,%d\n”,++n,电力(2,n)); //错误
不同的编译器可能产生不同的结果。,这取决于N的自我增值操作,谁是前面的人。。
值得注意的是,不要混淆逗号表达式,好的表达可以参考这篇文章。:C语言中的逗号运算符和逗号表达式
参考: C语言(第二版) P43
三.指针的直接修改 const 常量的值

通过赋值直接修改const变量的值。,编译器会出错。,但它不会被指针修改。

2. 6笔,笔体和笔色:但6笔颜色各不相同,所有戴错钢笔帽的人有多少?
A:265
B: 266
C:267
D:268
答案:A
解析:在线摘录(故障排除公式)
第一步,把N元素放在一个位置,例如,位置k,总共有n-1个方法;
第二步骤,将一个元素编号为k,此时有两起案件。:把它放在适当的位置,那么,对于剩余的n-1个元素,因为k元素被放置在位置n,剩下的n-2个元素具有D(n-2)方法;第一个K元素不把它放在n位。,这时,对于这些n-1个元素,有一个D(n-1)方法(等价于原始n中的一对k)。,当时,K没有被置于N的位置。,类似的调试的形成,不能编一个匹配的语言。,有n-1个元素。;
全面地
D(n) = (n-1) [D(n-2) + D(n-1)]

3. 我假定变量,f,d数据类型分别为int,浮点和双(由补码表示的int),float和double使用IEEE754单精度和双精度浮点数 点数据格式表示,已知i=785,如果它在32位机器中 执行以下关系表达式,结果是真的。
(i)i =(int)(浮点)i
(ii)f=(浮点)(int)f
(iii)f=(浮点)(double) f
(IV)(d+f)-d==f
A:只有我和二
B:只有我和二I
C:只有第二和第三
D:只有第三和第四
答案:B
(i)i =(int)(浮点)i 由于i(int)经过强制类型转换从int->float->int和左边相同 正确
(ii)f=(浮点)(int)f 因为f(浮点)是强制类型转换。 从float->int,尽管int也强制要转换类型,但小数点具有,故精度丢失,它和左边的不一样。,错误
(iii)f=(浮点)(double) f 因为f(浮点)是强制类型转换。 从浮动>双>浮动到左边 正确
(IV)(d+f)-d==f 向左,以确保准确性不会丢失。,一般来说,从浮点型到双精度转换为高精度。 不同于右边的浮子。 错误

4. 每个试卷有一个8位二进制序列号。。当且仅当序列号包含偶数1的时候。,它是有效的。。例如,00000000、01010011是有效的序列号。,1111111 0不是。那么,有效序列号 个
A:127
B:128
C:255
D:256
答案:B
总的来说,有2个8=256个序列。,它甚至包含1个偶数。,或奇数,因此,一半被分成128个。。
(可理解为两种分布) (1 +(-1))^8, 由于 (1-1)^8=0,则 结果的有效和无效的一半。

5. 求输出结果

int a[2][2][3]= { {{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};
int *ptr=(int *)(&a+1);
printf(“%d %d”, (int)(a+1), *(ptr-1));

A:7 12
B:1 6
C:1 3
D:7 9
正确答案: A
6. 有几种情况,只能用于初始化 list 不能使用分配?

A:当类包含常量成员变量时
B:当基类没有默认构造函数时,所有有引用的构造函数都需要初始化表。。
C:当类包含引用成员变量时
D:当类包含静态成员变量时
正确答案: A B C
因为const对象和引用只能初始化,不能是,因此只能使用成员初始化列表。。
对于非内置类型,在进入函数体之前,如果没有显式初始化,调用默认构造函数初始化。。如果没有默认构造函数,编译器试图调用默认构造函数失败。,如果没有默认构造函数,必须在初始化列表中显示的调用构造函数。
static 成员在构造函数执行之前已经构造好了。,即使没有类对象,也可以使用,不需要初始化列表。
7. 下面的TCP连接建立过程是正确的:
A:服务端收到客户端的SYN包后等待2*ml时间后就会进入SYN_SENT状态
B:服务器将接收client'sack PA后进入syn_rcvd状态
C:当客户处于既定状态时,还可以将服务器的syn_rcvd状态
D:服务器没有接收到客户端确认包。,等待2×ml时间后,连接将直接关闭。
正确答案: C
D,如果服务器是在syn_recv状态,发送同步 确认包后,没有收到来自客户端的确认包,一般来说,它会试着重试。,重新发送同步 确认包,然后等待一段时间把未完成的连接丢弃。,这个周期的长度称为SYN。 Timeout,一般来说,这次是震级(大约30秒2英里)。;用户的异常导致服务器中的线程等待1分钟,而我,但是如果恶意攻击者对这种情况做了大量的模拟,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源—-数以万计的半连接,即使简单的保存和遍历也会消耗大量的CPU时间和内存。,我们也试着在这个列表中重试SYN ACK的IP。。在这一点上,从正常客户的角度出发,服务器失去响应,这就是我们所说的:服务器端是SYN 洪水攻击(SYN洪水攻击)

8. 下面的CSMA/CD的正确描述是什么?
A:在发送数据之前,网络是否空闲
B:网络是否可以检测何时发送数据
C:数据传输过程中的冲突检测
D:主机在碰撞后具有一个小的MAC地址,传输之前
答案:AC
CSMA协议,载波监听多址冲突协议。
A,发送前免费检测,只有当信道空闲时才传输数据。
B,传输发送时,当前信号占用信道。,通道不能空闲。,检测空闲是没有意义的。
C,传输过程中的冲突检测,如果有冲突,Stop sending immediately,随机避让。
D,冲突后发送,两个发送端随机抽取一段时间。,回避时间是随机的。,同等优先,没有高优先级。
哪些线程同步锁可以递归地锁定在9以下。
1。信号量 2。读写锁 三.互斥 4。事件 5。临界区(临界区) 部分)
A: 1,3,4,5
B:5
C:3,5
D:1,3,5
正确答案: C
进程/线程同步方法
一个常见的进程/线程同步的方法有一个互斥体(或互斥体物、Read write lock (rdlock)、条件变量(待续)、信号量(semophore)等。
在windows系统中,临界区(临界区) 部分)和事件对象(Event)也是常用的同步方法。
递归锁/非递归锁
互斥可以分为递归锁(递归)。 互斥锁和非递归锁(非递归) 互斥)。 递归锁也称为可重入锁(重入式锁)。 互斥),非递归锁也叫不可重入锁(non-reentrant 互斥)。
两者之间的唯一区别是:
同一线程可以多次获得相同的递归锁。,不会产生僵局。。
如果线程多次获得相同的非递归锁,会有一个僵局。
Mutex与windows下的临界 Section is recursively。
Linux下的pthread_mutex_t锁是默认的非递归。的pthread_mutex_recursive属性可以设置通过设置,设置pthread_mutex_t锁作为一个递归锁。
10. A、B、C、d四个程序员工作的候选人,对这个职位的要求是:java水平;了解数据库的开发;会Web开发;经验与C。符合大多数条件的人,雇佣谁被雇用?。(1)上述四项要求和条件22的结合,每种组合都只有一种满足感。。同时已知(2)A和Bjava熟练(3)B和C会Web(4)C和D懂数据库(5)D有C++经验那么,被聘为__
A:A
B:B
C:C
D:D
E:四人平等机会
F:以上所有这些都是错误的。
解析:据推测(s是一个数据库)
A B C D
java java X X
X web web X
S X S S
X C X C
所以B
11. 下面程序的结果是:

class Supper{
    public Integer get()
    {
        ("s");
        return4;
    }
}
publicclasstestextendsSupper{public Long get()
    {
        ("b");
        returnnew Long("5");
    }
     publicstaticvoidmain(字符串 args[])
     {
         Supper s=new Supper();
         test test=new test();
         ();
         ();
     }
}

答:编译错误

扩展:
11. 1以下程序的结果是:

class Supper{
    public Integer get()
    {
        系统。out.println("Supper");
        returnnew Integer("5");
    }
}
publicclass Sub{
    publicintget()
    {
        系统。out.println("Sub");
        return5;
    }
     publicstaticvoidmain(字符串 args[]) {
         new Supper().get();
         new Sub().get();

     }
}

答:晚餐 Sub

11. 2以下程序的结果是:

class Supper{
    publicintget()
    {
        系统。out.println("Supper");
        return5;
    }
}
publicclass Sub{
    publicintget()
    {
        系统。out.println("Sub");
        returnnew Integer("5");

    }
     publicstaticvoidmain(字符串 args[]) {
         new Supper().get();
         new Sub().get();

     }
}

答:晚餐 Sub
12. 上述程序的结果是:

int* pint = 0; 
pint += 6; 
cout << pint << endl;

A:12
B:72
C:24
D:0
E:6
F:任意数
答案:C
13. 上述程序的结果是:

publicclass Base {
    static Base a=new Base();
    {系统。out.print("C");}
    static{ 系统。out.print("S"); }
    Base(){}
     publicstaticvoidmain(字符串 args[]) {
         new Base();
     }
}

答案:CSC
14. 字符串 alibaba 有多少种不同的安排
思路:有序排列:aaabbli。第一个递归(aabbli), b(aaabli), l(aaabbli) ,i(aaabbl)…依 二级交换不同。 只计算单词的个数,就用:一个(7,7) / (a(3),3)*A(2,2)) = 420
15. 校园网用户无法访问外部站点。,经理在Windows 操作系统 可用于以下 故障发生在校园网或校园网之外。

16. 应用层协议使用的UDP,那些是TCP
21/tcp FTP 文件传输协议
22/tcp SSH 安全登录、文件传输(SCP)和端口重定向
23/tcp Telnet 不安全的文件传输
25/tcp SMTP Simple Mail Transfer Protocol (电子邮件)
69/udp TFTP Trivial File Transfer Protocol
79/tcp finger Finger
80/tcp HTTP 超文本传送协议 (WWW)
88/tcp Kerberos Authenticating agent
110/tcp POP3 Post Office Protocol (电子邮件)
113/tcp ident old identification server system
119/tcp NNTP used for usenet newsgroups
220/tcp IMAP3
443/tcp HTTPS used for securely transferring web pages

UDP支持的应用层协议主要是:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名系统)、TFTP(普通文件传输协议),等。

PS:DNS服务器在更新数据时使用TCP。,当使用其他查询时,TCP
17. 写新的malloc、删除与免费的区别

从面向对象,在新建/删除和分配/释放的差异:Malloc /自由才是唯一的办法 贮藏空间的分布与释放,以及使用新/删除时,不仅分配了内存空间。,如果新的/删除的 它是一个类,还将调用类(通过测试),基本类型不象阿德的构造函数或分析 构函数。   简单来说,两者的区别主要是:
1. malloc与free是C++/C语言的标准库函数,新的/删除是C的操作符。, 与”+“、”-“、”*“、相同位置。
2. 新的/删除可以重载。,重负荷后,这是一个函数。
3. 当malloc申请内存,必须提供应用程序的长度。,返回的指针无效。 型,必须强转换为需要类型。。
4. 当新/删除在类中重载时,可以自定义应用程序过程。,例如,在记录应用程序中 总存储长度,指向每个对象的指针。
5. new/delete,事实上,malloc/free也叫内。

两者的共同点是: 1. 所有必须配对,防止内存泄漏。 2. 所有这些都可以用于动态内存和释放内存。,所有这些都在堆中分配内存。。

18. 下面的程序输出:
Object o1 = true ? new 整数(1) : new Double();

Object o2;
if (真的)
o2 = new 整数(1);
else
o2 = new Double();
(o1);
(O2)

答案:
1.0
1
解析:当第二个第三操作可以转换为数字类型时,可能的类型提升、自动拆装箱
参考:https://blog.jooq.org/2013/10/08/java-auto-unboxing-gotcha-beware/

19. 下面的程序输出:


class Y{
    publicY(){
        ("Y");
    }
}
class Supper{
    Y y=new Y();
    publicSupper(){
        ("Supper");
    }
}
publicclassSubextendsSupper{
    Y y=new Y();
    publicSub(){
        ("Sub");
    }
     publicstaticvoidmain(字符串 args[]) {
        new Sub();   
     }

}

答案:
Y
Supper
Y
Sub

20. 存在使我 + 1 < i的数吗()
答案:存在 解析:如果我是int类型,然后,当我是可以用int表示的最大整数。,我 1溢出到一个否定,此时不就< i了吗。
扩展:存在使我 > j || i <= j不成立的数吗()="" 答案:存在 解析:例如,Float.NaN

21. 0.6332的数据类型是
A float B double C Float D Double
答案:B 解析:默认为双类型。,如果需要向浮点类型添加f显示,即
扩展:数据类型的34892234343是int。,即使它被使用,也可能有溢出。,如果你想把它定义为长的,你需要加上l,如34l。

22. 你能创建没有构造函数的对象吗?
A 是 B 否
答案:A 解析:用java创建对象的几种方法(重要):
(1) 用新语句创建对象,这是最常见的创建对象的方法。。
(2) 使用反射的方法,NewInstance()调用类的实例的方法。
(3) 对象调用的克隆()方法。
(4) 使用反序列化的手段,调用对象 readObject()方法。 (1)和(2)显式显式调用构造函数 ;(3)内存中现有对象的副本,因此构造函数不会被调用。 ; (4)是从文件中还原类的对象。,构造函数不会被调用。。

23.

publicstaticvoidmain(字符串 args[]) {
        String s;
        系统。out.println("s:"+s);
     }

A 代码编译,输出s
B 代码编译,输出为空
C 因为字符串 s未初始化,无法编译和传递代码。
D 代码编译,但捕捉 NullPointException异常
答案:C 解析:它开始认为null将被输出。,运行之后,会发现定义或对象的所有基本类型。 出值。

24. 如何用java实现代理机制(JDK、CGLIB)
JDK动态代理:代理类和目标类实现一个公共接口。,使用InvocationHandler接口(重新调用方法)。缺点:只有代理接口,非代理类。
CGLIB动态代理:代理类是目标类的子类。, 使用methodinterceptor接口

25. 多线程的实现
继承线程类、Runnable接口的实现、使用ExecutorService、Callable、未来将使用返回结果实现多线程。

26. 如何停止线程
不建议使用线程停止,暂停和其他相关方法(这些都是丢弃的方法),它会导致一种不确定的状态。
可使用()方法,设置中断注释。这种方法可以产生不同的参数。:
1。如果线程被阻塞 waitXX(), 联接(xx), 睡眠(xx)系统被置于,线程的中断标志将是透明的。,并抛出InterruptedException异常。
2。如果某些IO操作中的线程被阻塞(如 InterruptibleChannel, 选择器),中断状态将被设置。,从IO操作返回,并抛出相应的异常(ClosedByInterruptException)。
三.一般状态:只设置中断标志(即,如果不检查状态并执行,不接受它是一回事。
4。如果线程已经死了,不会有什么效果。。

27. 什么是线程安全
线程安全是对同一代码的多线程访问。,不会产生不确定的结果。。

28. 如何保证线程安全
将共享变量转换为局部变量,或使用ThreadLocal(实际上是一个地图),键是线程标识)
线程安全类
自己控制,比如锁等。

29. 如何同步使用
同步是java关键字,它是同步锁。。它修改的对象如下:
一. 修改一段代码,修改后的代码块称为同步块。,作用的范围是斜体封闭代码,操作的对象是调用代码块的对象。;
二. 修改方法,修改后的方法称为同步方法。,它的作用范围是整个方法。,动作的对象是调用方法的对象。;
三. 修改静态方法,它的作用范围是整个静态方法。,动作的对象是这类对象。;

30. 多线程如何进行信息交互
void notify() 唤醒等待此对象监视器的单个线程。
void notifyAll() 唤醒在这个对象监视器上等待的所有线程。
void wait() 使当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。
void 等待(长 超时) 使当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者超过规定的时间。
void 等待(长 timeout, int Nano) 使当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者其他线程中断当前线程。,或者超过一定的时间。

31. 睡眠和等待的区别(调查的方向是
所有InterruptedException异常将被抛出
睡眠()方法是线程类中的一种方法。,等待()方法是对象类中的一种方法。。
休眠()方法使程序暂停指定的执行。,放出CPU的其他线程,但他的监视状态仍然存在。,在指定时间到达时,将自动恢复运行状态。,在调用睡眠()方法的过程中,线程不释放对象锁。。然后调用等待()方法,线程将放弃对象锁定。,输入等待该对象的等待锁池,只有在通知之后,此线程才能进入对象锁定池。
32. 多线程死锁
死锁是指两个或两个以上的进程在执行过程中,争夺资源引起的相互等待现象,如果没有外力,他们不会被推进。。
僵局的原因:
1。由于系统资源不足。
两。这个过程的进展顺序是不恰当的。。
三。资源配置不当。

33. 如何产生死锁
一个。互斥条件:互斥是指一个过程在一定时期的资源。
两。非剥夺:过程获得了资源,在使用结束之前,没有强行剥夺。
三。请求和维持条件:当进程阻塞请求资源时,保留现有资源。
四。循环等待条件:若干进程之间的关系。

34. 死锁的预防
1。打破相互排斥的条件。即允许进程同时访问某些资源。但是,不允许同时访问某些资源。,喜爱打印机等,这是由资源本身的属性决定的。。所以,这种方法没有实际价值。。
两。打破不优先购买的条件。这是允许进程从占有者那里夺取某些资源。。就是说,当某个进程占用了一些资源时,它也在申请新的资源。,但它不能立即满足。,它必须释放它所拥有的所有资源。,申请的未来。它释放的资源可以分配给其他进程。。这相当于占有资源的过程是偷偷摸摸的。。这种防止死锁的方法很难实现。,系统的性能将得到降低。。
三。违反占有和适用条件。资源分配策略可以实现。。也就是说,一个过程适用于系统在我之前需要的所有资源。。如果流程所需的所有资源都不满足,没有分配资源。,这个过程暂时没有运行。。只有当系统能够满足铜的所有资源需求时,只需立即分配应用于流程的所有资源。。因为运行过程占用了它所需的所有资源。,所以不会发生占有资源又申请资源的现象,这样就不会发生死锁。。
四。中断循环等待条件,资源有序配置战略。采用这一策略,让资源预先编号。,分布的数量,应用过程,资源的使用没有循环。。对资源的所有过程请求都必须严格按照。这个过程占用了小号资源。,申请大资源,不会有循环,这样可以防止死锁。。

35. 什么是守护线程,如何实现守护线程
守护线程是为O操作提供服务的线程。。
setDaemon(boolean 在该方法上,设置线程的守护进程模式是很方便的。,真是一个守护进程,false是用户模式。 必须在线程开始生效之前设置。

36. 技术和java线程池的原理

37. java包并行和普通班
各种类型包的概述:
线程池:
锁:
集合:

38. volatile关键字
可变变量修正,当线程每次使用变量时,变量的最大值是读的。。易挥发易被误用。,用于原子操作。
在java语言中的volatile变量可以被视为一种 程度较轻。 synchronized”;与 synchronized 块相比,volatile 变量所需的代码数量较少。,而且跑步的费用更少。,但是它可以执行的函数只是同步的一部分。。锁提供了两个主要特性:互斥(相互) 排除)和可见性(可见性)。互斥意味着只允许一个线程持有特定的,因此,这一特性可以用来实现一个协调访问协议,这样,一次只能使用一个线程共享数据。。可见性必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的,如果没有由同步MEC提供的可见性保证,线程看到的共享变量可能是一个值或不一致值B。,这将造成许多严重的问题。。易变变量具有同步的可见性特征。,但它没有原子特性。。这意味着可以自动发现线程。 volatile 变量的最新值。
为易变变量提供理想的线程安全性,必须同时满足以下两个条件:变量的写操作不依赖于当前值。;这个变量不包含在其他变量的不变量中。。
第一个条件的限制使变量不使用。尽管增量操作(x )看起来像一个操作。,实际上它是一个由读取-修改-写入操作序列组成的组合操作,它必须以原子方式进行。,和挥发性不提供必要的原子属性。。需要实施正确的操作。 x 值在操作期间保持不变。,而 volatile 变量不能做到这一点。
每个线程在运行时都有一个线程堆栈。,线程堆栈保持线程运行时变量值信息。当线程访问对象的时间值时,首先,对应的堆内存中的变量的值是基础,然后将堆内存变量的具体值加载到本地m中。,设置变量的副本,线程将不再与对象i的值有任何关系。,相反,它直接修改复制变量的值。,修改后的片刻(在线程退出之前),自动将线程变量副本的值写入对象的。堆中对象的值更改。。

一个来自程序员的采访书。

39 i++问题、与运行优化
&&运算中,如果第一个操作数是false,第二个条件是不能判断的。,||运算中,如果第一个操作数为真,第二个条件是不能判断的。。

40 当函数的参数计算,它是从右到左的堆栈。

int*p={1,2,3};
   printf("%d,%d",*p,*(++p));

打印2,2

41 注意类型扩展和类型转换,知道这些类型是符号的还是无符号的(没有字节类型)
右移时,右移是一个符号(如果是负数),添加1,否则,弥补0)

42 优先操作
总体来说,一元运算符,前面是双元素运算符。
对于一元运算符:() > [] > -> > . > :: > 后缀++,– > !如如果!做的) > ~,如flags=~flags > 前缀++,– > -,(例如int) i=+1)> 取地址,指针*(如数据= p),address=&obj)> type,sizeof

    对于双元素运算符:移位减法乘法除法

在java符号右移:>>>
int x=-1;
((x>>>3 ));
(((x>>>3)<<3)); ((x>>3));

结果:
11111111111111111111111111111
11111111111111111111111111111000
11111111111111111111111111111111

运算符优先级:括号,下标,和。(成员)最高;
一个目标比一个双目望远镜高。;
算术双目望远镜的高度比其他双目望远镜高。;
移位运算 高于 关系操作(比较大小);
关系运算 高于 逐位操作(逐位和,或,否则);
按位运算 高于 逻辑操作(逻辑和,逻辑或);
三个目的之一 条件运算,低于逻辑运算;
分配比 , (序列操作)高。

这里写图片描述

这里写图片描述

43 x和角色(X-1)
x右边的1个清零

44 没有比较判断,输出,B中的大量

方法一:int max=( (a+b)  +abs(A-B)  )/2
方法二:    char *strs[2]={"a Large","b Large"};
           int c=a-b;
           c=unsinged(c) >>(sizeof(int)*8 -1);
           cout << strs[c];

45 没有中间变量,将a,B交换

-   方法一:(缺陷):将ab的结果可能溢出。
                a=a+b
                b=a-ba=a-b
    方法二:
                a=a^b
                b=a^ba=a^b

46 调用C编译器编译的函数,为什么是externC在后面?

  • 由不同编译器编译的代码与函数有关。,例如,C 支持重载,编译器需要重命名功能来达到区分的目的,但C中没有重载概念。,函数编译命名规则将不同于C。。因此,使用外 “c”,你可以告诉编译器这些差异。,不要让他发现这些符号

47 求结构中变量相对于结构的位移量
- (size_t) &( ((struct *)0) ->var ),将0转换为类型结构的指针变量,使用这个变量来获取var成员变量的偏移地址。。
p的起始地址是0。,成员变量瓦尔河的地址是它的偏移量。。

48 使用sizeof来计算类的大小时,不要考虑静态变量。
- 类、该结构的最小尺寸是1byte,即使没有成员变量

49 使用sizeof计算类、每小时的结构,需要考虑对齐问题。
- 一个整数倍的最大长度变量的大小(考虑,内部地址应该对齐。,例如,int类型的成员变量的地址必须是一个整数相乘,如:

struct A{
   bool m;
   int  n;
   bool k;
}

struct B{
   int  n;
   bool m;
   bool k;
}

a占12,b需要8字节(考虑b),如果B只占用6字节,如果有 B bb [ 2 ],bb [ 0 ]地址是0,bb [ 1 ]地址是6,BB [ 1 ]中int变量的n地址是6。,不是int类型长度的整数倍。,不好管理,B编译器将为8byte B,不用于填充0)

50 区分下列指针的含义

-       int*a,一指向某一点int类型的指针
        int**a,两级指针,它指向一个指针(指针指向一个指针)。intint*a[10]:一个数组,里面有10指向某一点int类型的指针
        int (*a)[10]:一个指针,指向一个10个元素的int数组
        int (*a)(int):函数指针,返回值是int,参数之一int的函数指针
        int  (*a[10])int :一个数组,里面有10个函数指针,函数指针指向返回值是int,参数之一int的函数

51 注意容器元素中的复制问题(浅拷贝)、深拷贝)

特别是,在存储在CO中的类型类成员中有指针。,使用浅拷贝,它会导致容器中的数据指针暂停。,如
   Vecotr <A>v=new Vector<A>()
   Aaa.p=new char[32]
   (a)
   delete a它将在这里发布。ap记忆,但因为它是一个浅拷贝,容器中的数据是一个挂起的指针。。
  • 当类中有指针类型的数据成员时,您需要仔细考虑它的构造函数(如何初始化)。,析构函数(如果指针不是空的),它需要删除掉。,拷贝构造函数,赋值运算符函数(需要作深拷贝)

52 如何在c中停止 实例化一个类。
- 使用抽象类,或将构造函数声明为私有

53 构造函数一般什么时候宣布为私有?
- 比如需要阻止编译器生成默认的构造函数的时候(或是某种类型的构造函数只是为其他重载形式的构造函数调用的时候)

54 当编译器生成默认副本时 constructor
- 如果你不写,需要使用,它会自动生成

55 如果一个方法不使用任何成员变量,不需要这个指针,不需要动态绑定(一般是非虚拟方法)。,它可以通过使用null激活。

- 如 SomeType *p =null;
   p->a();//可以正常运行
       ( (X*)0 )->x(); //可以正常运行

        ((X*)NULL)->x();//可以正常运行

JAVA 这是不可能的。,因为java方法是动态绑定

以下是关于C 的222个问题

56 C 支持多重继承,在多重继承中解决多个数据副本,C 使用虚基类
- 虚基类:基类定义不变性,子类继承,添加虚拟关键字,如:Sub 答:虚拟 Super B

57 多态,它又分为静态多态性和动态多态性。
- 静态多态性主要是模板(实际使用的类型)。
动态多态:主要是通过虚拟关键字

58 在C RTTI(运行时 Type 标识符)
- 动态类型识别,typeid运算符的使用和dynamic_cast。注意:使用动态类型的身份需要重新编译的代码的一部分在runti,保留某些类型的信息,导致效率低下,转换是不安全的。当使用类型转换dynamic_cast,在类中至少需要一个虚拟函数。。

59 C中的强制类型转换运算符
- 他们有4个人。:
dynamic_cast:
static_cast:
reinterpret_cast:
const_cast:

60 面向对象的主要思想
- 抽象、封装、继承、多态

61 多态的类型
- 强制多态(类型转换)、重载、类型化参数多态(模板)、包含多态(类继承和虚函数)

61 c的动力学
- 在C 的动态包括:虚函数、多态性、动态联编
虚拟函数:允许基类基类调用的方法和子类方法,如超 A=new Sub(); A->func(),在子调用中生成函数的一个版本。,您需要将函数声明为虚拟。,这是通过VTBL,vptr实现)
动态组合:也就是说,需要在运行时绑定一些信息。,又叫晚组合。

62 数组创建:

int*a=new int[3];//创建了一指向某一点int数组的指针,数组长度是3,相应的删除方法是delete []a;
   int*b=new int(3);//创建一个int类型的指针,所指示的值是 3,相应的删除方法是delete b;
   int  c[3];//数组的长度被声明为3int型数组,这样就声明了把C放在堆栈上。,此时此刻,数组的长度必须是常数。。

63 常见类型比较

   int的直接比较 : a==b
   char直接比较 : a==b
   float,double: abs(a-b)<=某个误差值 char *p,或是char []:strcmp( a,b)==0string : a==b

64 在char数组中自动计算大小,最后的长度=实际长度 1。
(将添加一个\\ 0),实际字符串中是否有一个\ 0,但当输出字符串生成时,遇到0,就不输出了。
这里写图片描述

这里写图片描述

65 使用sizeof来计算类的大小时,不要考虑静态变量。,不必考虑它的方法。
使用sizeof计算类、结构变量的时间,需要考虑对其问题(按最长的字段的整数倍(如果最长长度的变量超过了cpu长度,根据CPU长度)

sizeof和strlen的区别

strlen这是一个函数,参数为char*,计算规则以字符串开头。,遇到\0结束,长度不包括0。如char a[]="ab\0\0",strlen(一)2,sizeof(一)5;
        sizeof类似于宏,大多数编译器可以在编译时计算它们的值。,而strlen这是跑步期的结果。。
        (int *p = (int*)malloc(sizeof(int) * 100);
            cout << sizeof(p) << endl;sizeof计算是指针的空间。,32位系统4(关于这个。:如果没有动态初始化char*使用strlen,结果是未定义的。,这是strlen的逻辑,只有满足0只有结束)

         sizeof:

66 虚拟修饰符将是隐形的。
也就是说,在父类中,方法是虚拟的。,子类中的重写方法,没有添加虚拟关键字,但这种方法仍然是虚函数。。

67 基本数据类型中的字节数。
16位编译器

char1个字节
char(即指针变量) 2个字节
shortint : 2个字节
int2个字节
unsignedint : 2个字节
float:  4个字节
long:   4个字节
unsignedlong:  4个字节
longlong:  8个字节
double:   8个字节

32位编译器

char1个字节
char(即指针变量) 4个字节(32位的可寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
shortint : 2个字节
int4个字节
unsignedint : 4个字节
float:  4个字节
long:   4个字节
unsignedlong:  4个字节
longlong:  8个字节
double:   8个字节

64位编译器

char1个字节
char(即指针变量) 8个字节
shortint : 2个字节
int4个字节
unsignedint : 4个字节
float:  4个字节
long:   8个字节
unsignedlong:  8个字节
longlong:  8个字节
double:   8个字节

68 通用头文件

#include     #include      #include    #include    #include    #include    #include      #include    #include    #include    #include    #include       #include     #include    #include    #include    #include       #include        #include    #include        #include      #include    #include      #include      #include       #include        #include      #include       #include     #include     #include      #include      #include      #include    #include    usingnamespacestd;   

69 常用C头文件

#include     #include      #include      #include      #include         #include     #include     #include <>     #include         #include         #include         #include         #include      #include     #include <>    #include      #include      #include     

70 包含文档的各种写作形式的区别

仅在系统指定路径下搜索,首先您将查找源文件的路径。,找到通往系统路径的路

  • 包含头文件中的语句。,双引号和尖括号的区别是什么?
  • include <>格式:参考标准库头文件,编译器开始从标准库目录中搜索。

    incluce “”格式:引用非标准库的头文件。,编译器开始从用户的工作目录中搜索。

    • 没有木头和H,只要包含文件的名称,它确实存在。。
      例如,经常写#包括 ,然后系统包含路径,这是真的,有一个文件。。
      H只是一个练习。,提示这是头文件。,不强制。

C 头文件加H和非H之间的区别是什么
Iostream is the header file of the C,它是C的头文件。,这是标准的C 头文件没有.h扩展,将前面的C头文件转换为C的头文件,有时C的前缀表示来自C。,例如,cmath改。。 它定义的所有类和对象都在全局空间中。,所以你可以直接使用cout 但在iostream,它定义的是名称空间STD。,所以你必须加上 using namespace 性病可以使用cout 一个古老的C 的库文件与H的延伸,比如,在新标准之后的标准库中,有一个相应的RES。,除了后者的许多改进之外,还有一点就是后者的东东都塞进了“std”名字空间中。 但只有字符串是特殊的。。 问题是,C 与C标准库兼容,而C的标准居里恰好有一个叫做,包含一些常用的C字符串处理函数。,例如,StrCmp。 这个头文件与C的字符串类无关。,所以这不是升级版,它们是两个无关的第一个文档。。