最近的一些校招试题摘录

本文深入解析了volatile的作用、位运算实现设置与清除特定位的操作、TCP/IP协议中端口号的作用及常见用途、浏览器从输入URL到显示网页的过程,并提供了相关代码示例。此外,还详细解释了C++中不同类型的转换与输出结果的计算逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近又参加了一些校招,真是马不停蹄啊。多参加考试是好的,可以不断发现一些新的问题。下面摘录一些我不太会的题。

1.volatile的作用是什么?

答案:volatile是类型修饰符,用它修饰的类型变量可能会被编译器未知的因素更改,比如操作系统、硬件、线程等。遇到这个关键字修饰的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

参考文献:

C/C++ volatile让你看的更明白

讲讲C++中的volatile关键字


2.位运算,给定一个整形变量a,写两段代码,第一个设置a的bit 3为1,第二个清除a的bit 3为0,在以上两操作中要求保持其它位不变。

答案:

#define  BIT3 (0x1<<3)
static int a;
void set_bit3()
{
	a |= BIT3;
}
void claer_bit3()
{
	a &= ~BIT3;
}

3.TCP/IP协议中,端口号的作用?

答案:

参考《 TCP/IP协议号和端口 》,《端口号的作用及常见端口号用途说明

端口号的作用,主要是区分服务类别和在同一时间进行多个会话。

举例来说,有主机A需要对外提供FTP和WWW两种服务,如果没有端口号存在的 话,这两种服务是无法区分的。实际上,当网络上某主机B需要访问A的FTP服务时,就要指定目的端口号为21;当需要访问A的WWW服务时,则需要将目的 端口号设为80,这时A根据B访问的端口号,就可以区分B的两种不同请求。这就是端口号区分服务类别的作用。
 再举个例子:主机A需要同时 下载网络上某FTP服务器B上的两个文件,那么A需要 与B同时建立两个会话,而这两个传输会话就是靠源端口号来区分的。在这种情况下如果没有源端口号的概念,那么A就无法区分B传回的数据究竟是属于哪个会话,属于哪个文件。而实际上的通信过程是,A使用本机的1025号端口请求B的21号端口上的文件1,同时又使用1026号端口请求文件2。对于返回的数 据,发现是传回给1025号端口的,就认为是属于文件1;传回给1026号端口的,则认为是属于文件2。这就是端口号区分多个会话的作用。
TCP 21端口:FTP 文件传输服务
UDP 53端口:DNS 域名解析服务
TCP 80端口:HTTP 超文本传输服务
TCP 443端口:HTTPS 加密的超文本传输服务

4.当我们在浏览器中键入“facebook.com”时,然后浏览器就显示百度主页,请问在这个过程中,发生了什么?

答案: 

参考《百度面试题:从输入url到显示网页,后台发生了什么?》

基本步骤:1).在浏览器中键入域名   2).浏览器通过DNS查找域名的IP地址   3).浏览器给web服务器发送一个HTTP请求  4). facebook服务的301永久重定向响应 

5). 浏览器跟踪重定向地址 6). 服务器“处理”请求   7).服务器发回一个HTML响应  8).浏览器开始显示HTML 


5. 如下:

#include <iostream>
using namespace std;
int main()
{
	unsigned short a = 10;
	printf("%u\n", ~a);
	printf("%d\n", ~a);
	unsigned char b = 125;
	printf("%d", b);
	return 0;
}
请问输出结果是___________________

答案:

                   4294967285
                    -11
                   125
解析:short的字节数是2,也就是16位,当a=10时,二进制表示:0000 0000 0000 1010,~a若是表示为%u,即unsigned int ,由于

它的字节数是4,所以共32位。所以先将a补成32位,即0000 0000 0000 0000 0000 0000 0000 1010,然后取反,~a即表示为:1111 1111 1111 1111 1111 1111 1111  0101

由于是unsigned,所以首位是1,不表示符号位,直接计算就知道:2^31+2^30+.......+2^4+2^2+1=4294967285.

但是如果是%d呢?则首位表示符号位,代表是负数,将其表示为10进制,方法是:1.二进制减1,然后取反,得:0000 0000 0000 0000 0000 0000 0000 1011,所以应该是-11

而char同理,直接转为int,由于unsigned char为1个字节,表示范围:0——255,125在其中,所以直接转为int,仍然是125。

那么:如果上题附加:

#include <iostream>
using namespace std;

 
int main()
{
	
	unsigned char b = 259;
	printf("%d\n", b);

	unsigned char i = -1;
	int p = (int)i;
	printf("p=%d\n", p);

	char j = -1;
	int q = (int)j;
	printf("q=%d\n",q);
	return 0;
}
答案:

                          3

                      p=255
                        q=-1
.解析:

1)、首先259转为二进制,即为:1 0000 0011,然后由于unsigned char为1个字节,8位,故要截去最前面的1,剩下的就是0000 0011,即为3.或者也可以从另外一个角度来看:unsigened char的范围是0-255,259大于255,所以溢出,反向循环过去,为259-255-1=3 .(PS:256-0,257-1,258-2,259-3)。


2)、-1的二进制表示为1111 1111(取8位),由于-1赋给unsigned char,所以首位不是符号位,因此转化为十进制,前面补0:00000000 00000000 00000000 11111111,即为255,或者unsigned char的范围:0-255,因此-1溢出,变为255.


3)、-1的二进制表示为1111 1111(取8位),由于-1赋给char,所以首位是符号位,因此转化为十进制,前面补1:11111111 11111111 11111111 11111111,即为-1,或者char的范围:-128-127,因此-1没有溢出,因此还是-1.


6.  寄存器变量的作用?

答:当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。 

参考:《 c语言性能优化—使用寄存器变量》  《静态变量和寄存器变量

7.

有3个文件,A,B,C,其中A定义了一个全局变量,B,C都包含了A这个头文件,问是否可行?

若改为其中A定义了一个静态全局变量,B,C都包含了A这个头文件,问又是否可行?

答案:第一个可行,第二个不可行。可以参考《静态变量和寄存器变量》。主要原因是第一个默认全局变量的作用域是整个源程序。 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而第二个静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值