最近又參加了一些校招,真是馬不停蹄啊。多參加考試是好的,可以不斷發現一些新的問題。下面摘錄一些我不太會的題。
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這個頭文件,問又是否可行?
答案:第一個可行,第二個不可行。可以參考《靜態變量和寄存器變量》。主要原因是第一個默認全局變量的作用域是整個源程序。 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而第二個靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。