C++/C面试题

(1)

按位运算只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用;

(2)

一般在打开网页时,需要在浏览器中输入网址,因此,需要通过网址找到访问资源的 IP 地址,从而可以把请求发送到对应的机器上,在这个过程中需要 DNS(Domain Name System, 域名系统,它是互联网上作为域名和 IP 地址相互映射的一个分布式数据库,能够使用户更 方便地访问互联网,而不用去记住能够被机器直接读取的 IP 数据串。通过主机名,最终得 到该主机名对应的 IP 地址的过程称为“域名解析”)协议;HTTP 是用于从 Web 服务器传输超文本到本地浏览器的传输协议。浏览器与服务器通过 HTTP 进行交互。HTTP 是应用层协议,在传输层是通过 TCP 来传输 HTTP 请求的。Telnet 是 Internet 远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。一般使用方法为通过终端登录到远处主机,因此,在浏览器打开网页的过程中用不到。

(3)属于构造散函数的方法是

常用的构造散列函数的方法有直接定址法数字分析法、平方取中法、折叠法、除留余 数法和随机数法

1)直接定址法:取关键字或关键字的某个线性函数值为散列地址。例如,H(key)=a*key+b, 其中,a 和 b 为常数。

2)数字分析法:假设关键字是以 r 为基数(例如以 10 为基数的十进制数)的,并且散列表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成散列地址。

3)平方取中法:取关键字平方后的中间几位作为散列地址。

4)折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为散列地址。
5)除留余数法:取关键字被某个小于或等于散列表长 m 的数 p 除后所得的余数作为散 列地址(f(key) = key mod p (p≤m),m 为散列表表长)。

6)随机数法:选择一个随机函数,取关键字的随机函数值作为它的散列地址。

(4)

拷贝构造函数是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他 对象的构建及初始化。拷贝构造函数的名称必须与类名称一致,函数的形式参数是本类型的 一个引用变量,并且必须是引用;

(5)静态成员函数独立于对象而存在,无法实现多态,而且静态成员函数没有this 指针,无法找到虚函数表,所以不能将静态成员函数设计为虚函数;

(6)函数的 inline 属性是在编译时确定的,是静态行为。而 virtual 的性质是在运行时确定的,是动态行为。

(7)不能用返回值来区分重载函数,判断依据是: 参数类型,参数个数。

(8)已知集合 A 和集合 B 的元素分别用不含头结点的单链表存储,函数 difference()用于求解 集合 A 与集合 B 的差集,运算结果保存在集合 A 的单链表中。例如,若集合 A={5,10,20,15,25,30},集合 B={5,15,35,25},完成计算后 A={10,20,30}。

struct node
{
int value;
node* next;
};

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include"difference.h"
void difference(node** LA, node* LB)
{
node *pa, *pb, *pr, *q;//pr用来删除节点时候的链接
pr = NULL;
pa = *LA;
while (pa)//以链表LA中的值为参考,依次与LB中元素比较
{
pb = LB;
while (pb&&pb->value != pa->value)//LB链表没有到末尾且……
pa = pa->next;
if (pb)//找到一个相同的值,这里用非空
{
if (!pr)//pr用来指向相同元素的前节点,这里是头节点
*LA = pa->next;
else//LA的头节点在LB中没有找到相同的值,即不是头节点
pr->next = pa->next;//
q = pa->next;//删除相同的节点
pa = pa->next;
free(q);
}
else//LB遍历完了也没有找到相同的,
{
pr = pa;
pa = pa->next;
}
}
}

(9)静态局部变量存储在进程的全局区;

(10).有一个变量 .有一个变量 .有一个变量 int int a=0a=0 ,两个线程同时对其进行 +1 操作,每个线程加 100次操作不加锁最后 次,不加锁最后 次,不加锁最后a的值为?

多线程(Multithreading)是指在软件或者硬件上实现多个线程的并发执行。本题中,+1 操作的执行过程如下:取出变量 a,对变量 a 执行+1 操作,把计算结果放回去。如果两个线 程中+1 操作都没有被中断,所有+1 操作都生效了,那么此时相应地对 a 执行了 200 次+1 操 作,在这种情况下,a 的值变为 200。

由于这两个线程在对 a 执行+1 操作时,并没有加锁, 因此,有可能会导致部分+1 操作丢失。过程如下所示:

1)线程 1 读取变量 a 的值(读取到寄存器中)为 0。

2)线程 2 读取变量 a 的值,此时读取到的值也为 0。

3)线程 1 对 a 执行+1 操作并放回去,此时 a 的值为 1。

4)线程 2 也对 a 执行+1 操作并放回去,由于此时线程 2 中寄存器中 a 的值为 0,执行 +1 操作后变为 1 并放回去,此时 a 的值还为 1。

在这种情况下,线程 1 对 a 执行+1 的操作就会丢失。因此,执行结束后,a 的最大值为 200

上一篇:react_app 项目开发


下一篇:C++ - 派生类访问模板基类(templatized base class)命名