最近的一些校招试题摘录
最近又參加了一些校招,真是馬不停蹄啊。多參加考試是好的,可以不斷發(fā)現(xiàn)一些新的問題。下面摘錄一些我不太會的題。
1.volatile的作用是什么?
答案:volatile是類型修飾符,用它修飾的類型變量可能會被編譯器未知的因素更改,比如操作系統(tǒng)、硬件、線程等。遇到這個關(guān)鍵字修飾的變量,編譯器對訪問該變量的代碼就不再進(jìn)行優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問。
參考文獻(xiàn):
《C/C++ volatile讓你看的更明白》
《講講C++中的volatile關(guān)鍵字》
 
2.位運算,給定一個整形變量a,寫兩段代碼,第一個設(shè)置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協(xié)議中,端口號的作用?
答案:
參考《 TCP/IP協(xié)議號和端口 》,《端口號的作用及常見端口號用途說明》
端口號的作用,主要是區(qū)分服務(wù)類別和在同一時間進(jìn)行多個會話。
舉例來說,有主機(jī)A需要對外提供FTP和WWW兩種服務(wù),如果沒有端口號存在的 話,這兩種服務(wù)是無法區(qū)分的。實際上,當(dāng)網(wǎng)絡(luò)上某主機(jī)B需要訪問A的FTP服務(wù)時,就要指定目的端口號為21;當(dāng)需要訪問A的WWW服務(wù)時,則需要將目的 端口號設(shè)為80,這時A根據(jù)B訪問的端口號,就可以區(qū)分B的兩種不同請求。這就是端口號區(qū)分服務(wù)類別的作用。 再舉個例子:主機(jī)A需要同時下載網(wǎng)絡(luò)上某FTP服務(wù)器B上的兩個文件,那么A需要 與B同時建立兩個會話,而這兩個傳輸會話就是靠源端口號來區(qū)分的。在這種情況下如果沒有源端口號的概念,那么A就無法區(qū)分B傳回的數(shù)據(jù)究竟是屬于哪個會話,屬于哪個文件。而實際上的通信過程是,A使用本機(jī)的1025號端口請求B的21號端口上的文件1,同時又使用1026號端口請求文件2。對于返回的數(shù) 據(jù),發(fā)現(xiàn)是傳回給1025號端口的,就認(rèn)為是屬于文件1;傳回給1026號端口的,則認(rèn)為是屬于文件2。這就是端口號區(qū)分多個會話的作用。 TCP 21端口:FTP 文件傳輸服務(wù) UDP 53端口:DNS 域名解析服務(wù) TCP 80端口:HTTP 超文本傳輸服務(wù) TCP 443端口:HTTPS 加密的超文本傳輸服務(wù)4.當(dāng)我們在瀏覽器中鍵入“facebook.com”時,然后瀏覽器就顯示百度主頁,請問在這個過程中,發(fā)生了什么?
答案:?
參考《百度面試題:從輸入url到顯示網(wǎng)頁,后臺發(fā)生了什么?》
基本步驟:1).在瀏覽器中鍵入域名 ? 2).瀏覽器通過DNS查找域名的IP地址 ? 3).瀏覽器給web服務(wù)器發(fā)送一個HTTP請求 ?4).?facebook服務(wù)的301永久重定向響應(yīng)?
5).?瀏覽器跟蹤重定向地址 6).?服務(wù)器“處理”請求 ? 7).服務(wù)器發(fā)回一個HTML響應(yīng) ?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; }請問輸出結(jié)果是___________________答案:
? ? ? ? ? ? ? ? ? ?4294967285
 ? ? ? ? ? ? ? ? ? ? -11
 ? ? ? ? ? ? ? ? ? ?125
 解析:short的字節(jié)數(shù)是2,也就是16位,當(dāng)a=10時,二進(jìn)制表示:0000 0000 0000 1010,~a若是表示為%u,即unsigned int ,由于
它的字節(jié)數(shù)是4,所以共32位。所以先將a補(bǔ)成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呢?則首位表示符號位,代表是負(fù)數(shù),將其表示為10進(jìn)制,方法是:1.二進(jìn)制減1,然后取反,得:0000 0000 0000 0000 0000 0000 0000 1011,所以應(yīng)該是-11
而char同理,直接轉(zhuǎn)為int,由于unsigned char為1個字節(jié),表示范圍:0——255,125在其中,所以直接轉(zhuǎn)為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轉(zhuǎn)為二進(jìn)制,即為:1 0000 0011,然后由于unsigned char為1個字節(jié),8位,故要截去最前面的1,剩下的就是0000 0011,即為3.或者也可以從另外一個角度來看:unsigened char的范圍是0-255,259大于255,所以溢出,反向循環(huán)過去,為259-255-1=3 .(PS:256-0,257-1,258-2,259-3)。
 2)、-1的二進(jìn)制表示為1111 1111(取8位),由于-1賦給unsigned char,所以首位不是符號位,因此轉(zhuǎn)化為十進(jìn)制,前面補(bǔ)0:00000000 00000000 00000000 11111111,即為255,或者unsigned char的范圍:0-255,因此-1溢出,變?yōu)?55.
 3)、-1的二進(jìn)制表示為1111 1111(取8位),由于-1賦給char,所以首位是符號位,因此轉(zhuǎn)化為十進(jìn)制,前面補(bǔ)1:11111111 11111111 11111111 11111111,即為-1,或者char的范圍:-128-127,因此-1沒有溢出,因此還是-1.
 6. ?寄存器變量的作用?
答:當(dāng)對一個變量頻繁被讀寫時,需要反復(fù)訪問內(nèi)存,從而花費大量的存取時間。為此,C語言提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫,從而提高效率。寄存器變量的說明符是register。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計數(shù)是應(yīng)用寄存器變量的最好候選者。
參考:《  c語言性能優(yōu)化—使用寄存器變量》  《靜態(tài)變量和寄存器變量》
 
7.
有3個文件,A,B,C,其中A定義了一個全局變量,B,C都包含了A這個頭文件,問是否可行?
若改為其中A定義了一個靜態(tài)全局變量,B,C都包含了A這個頭文件,問又是否可行?
 
答案:第一個可行,第二個不可行??梢詤⒖肌鹅o態(tài)變量和寄存器變量》。主要原因是第一個默認(rèn)全局變量的作用域是整個源程序。 當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。 而第二個靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。
 
 
 
總結(jié)
以上是生活随笔為你收集整理的最近的一些校招试题摘录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: springboot创建子模块时遇到子模
 - 下一篇: rufus中gpt和mrb磁盘_计算机关