最近又参加了一些校招,真是马不停蹄啊。多参加考试是好的,可以不断发现一些新的问题。下面摘录一些我不太会的题。
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协议号和端口 》,《端口号的作用及常见端口号用途说明》
端口号的作用,主要是区分服务类别和在同一时间进行多个会话。
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这个头文件,问又是否可行?
答案:第一个可行,第二个不可行。可以参考《静态变量和寄存器变量》。主要原因是第一个默认全局变量的作用域是整个源程序。 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而第二个静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。