版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 C試題講解問答題部分:(面試中問到的內(nèi)容)1. 局部變量能否和全局變量重名? (華為) 解析:能,局部會(huì)屏蔽全局。要用全局變量,需要使用":" 局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)可以定義多個(gè)同名的局部變量.比如在兩個(gè)循環(huán)體內(nèi)都定義一個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內(nèi)。3. 如何引用一個(gè)已經(jīng)定義過的全局變量? (華為)解析:extern 可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個(gè)在頭文件中聲明的全局變
2、理,假定你將那個(gè)編寫錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)。4. static全局變量與普通的全局變量有什么區(qū)別?解析:1) 全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式從以上分析可以看出, static全局變量與普通的全局變量有什么區(qū)別: static全局變量只初使化一次,防止在其他文件單元中被引用; static局部變量和普通局部變量有什么區(qū)別:
3、;static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值; static函數(shù)與普通函數(shù)有什么區(qū)別: static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝5. 進(jìn)程和線程的差別(微軟亞洲)解析:答:線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體. 與進(jìn)程的區(qū)別: (1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位 (2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個(gè)進(jìn)程的多個(gè)線程之間也可并發(fā)執(zhí)行 (3)擁有資源:進(jìn)程是擁有資源的獨(dú)立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進(jìn)程的資源. (
4、4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時(shí)的開銷6. 用宏定義寫出swap(x,y)(思科)解析:#define swap(x, y) x = x + y; y = x - y; x = x - y7. 什么是預(yù)編譯,何時(shí)需要預(yù)編譯:(思科)解析:就是指程序執(zhí)行前的一些預(yù)處理工作,主要指#表示的. 何時(shí)需要預(yù)編譯? )、總是使用不經(jīng)常改動(dòng)的大型代
5、碼體。 )、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。8. 下述三個(gè)有什么區(qū)別?char * const p;char const * p,const char *p; (慧通)解:const char* p和char const *p修飾的是p所指向的變量,不可以用*p=a等這樣的方式修改變量區(qū)的內(nèi)容. 指針本身是可以修改的,比如說char x,y; const *p = &x, p = &y,修改指針本身是可以的,*p = b就不行。 Char *const p;中const修飾的是
6、指針,表明指針在操作過程中不可以修改, 而指針?biāo)赶虻膬?nèi)容是可以修改的,比如說char x ,y; char* const p = &x; *p = b是可以的, 但p=&y;是不可以的,const修飾的是指針,不可以修改指針的指向, 只可以修改指針?biāo)壍淖兞?9. int (*s10)(int) 表示的是什么啊 ? (慧通)解析:這樣的表達(dá)式可以遵循這樣的規(guī)則:從右向左,由近及遠(yuǎn),括號(hào)優(yōu)先;比如:從a符號(hào)開始。其右邊是10,說明a是個(gè)數(shù)組,其中存了十個(gè)元素。再看a的左邊是一個(gè)*。說明數(shù)組中存的是指針?,F(xiàn)在在看(*a10)的右邊是(int);說明所存的指針是指向有一個(gè)int形
7、參的函數(shù)現(xiàn)在看(*a10)的左邊是個(gè)int ,說明指向的函數(shù)的返回值為int 類型;10. 進(jìn)程之間通信的途徑,進(jìn)程間通信方法(慧通)解析:無名管道,命名管道,消息隊(duì)列,信號(hào),共享內(nèi)存,套接字。等11. 什么是“引用”?申明和使用“引用”要注意哪些問題?解析:引用就是某個(gè)目標(biāo)變量的“別名”(alias),對(duì)應(yīng)用的操作與對(duì)變量直接操作效果完全相同。申明一個(gè)引用的時(shí)候,切記要對(duì)其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類型,因此
8、引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。不能建立數(shù)組的引用12.include <filename.h>和include “filename.h”的區(qū)別?解析:<>是從標(biāo)準(zhǔn)庫(kù)路徑搜索, “”是從用戶當(dāng)前工作目錄開始,找不到,在到標(biāo)準(zhǔn)庫(kù)開始13.Heap和Stack的區(qū)別?解析:Heap是堆,Stack是棧。 棧的空間由操作系統(tǒng)自動(dòng)分配和回收,而堆上的空間由程序員申請(qǐng)和釋放。 棧的空間大小較小,而堆的空間較大。 棧的地址空間往低地址方向生長(zhǎng),而堆向高地址方向生長(zhǎng)。 棧的存取效率更高。 程序在編譯期間對(duì)變量和函數(shù)的內(nèi)存分配都在棧上, 且程序運(yùn)行過程中對(duì)函數(shù)調(diào)用中參
9、數(shù)的內(nèi)存分配也是在棧上。14.sizeof和strlen之間的區(qū)別?解析:(1)sizeof操作符的結(jié)果類型是size_t,它在頭文件中的typedef為unsigned int類型,該類型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。 (2)sizeof是運(yùn)算符,strlen是函數(shù) (3)sizeof可以用類型做參數(shù),strlen只能用char *做參數(shù),且必須是以0結(jié)尾的。 (4)數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針。 (5)大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過了是類型或是變量的長(zhǎng)度。 (6)strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,用來計(jì)算字符串的長(zhǎng)
10、度,而不是類型占用內(nèi)存的大小。 (7)sizeof后如果是類型必須加括號(hào),如果是變量名可以不加括號(hào)。 (8)當(dāng)使用了一個(gè)結(jié)構(gòu)類型或變量時(shí),sizeof返回實(shí)際的大小。 (9)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址。 (10)計(jì)算結(jié)構(gòu)變量的大小就必須討論數(shù)組對(duì)齊問題。 (11)sizeof操作符不能用于函數(shù)類型,不完全類型或位字段。15.#define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?解析:i 為30。 16.unsigned short hash(unsigned short key
11、) return (key>>)%256 解析 請(qǐng)問hash(16),hash(256)的值分別是: 17.bool double int float.各種類型與0值的比較(概率較大)解析:請(qǐng)寫出 BOOL flag 與“零值”比較的 if 語(yǔ)句。if ( flag ) 或者&
12、#160; if ( !flag ) 如下寫法均屬不良風(fēng)格,不得分。 if (flag = TRUE) if (flag = 1 ) if (flag =
13、FALSE) if (flag = 0) 請(qǐng)寫出 float x 與“零值”比較的 if 語(yǔ)句。(4分) 標(biāo)準(zhǔn)答案示例: const float EPSINON = 0.00001; if (x >= - EPSINON) && (x
14、160;<= EPSINON) 不可將浮點(diǎn)變量用“=”或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>=”或“<=”此類形式如下是錯(cuò)誤的寫法,不得分。 if (x = 0.0) if (x != 0.0) 請(qǐng)寫出 char *p 與“
15、零值”比較的 if 語(yǔ)句。(3分) 標(biāo)準(zhǔn)答案: if (p = NULL) 或者 if (p != NULL) 如下寫法均屬不良風(fēng)格,不得分。 if (p = 0) if (p != 0)
16、; if (p) if (!) 18.結(jié)構(gòu)與聯(lián)合有和區(qū)別? 解析:1. 結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 聯(lián)合中只存放了一個(gè)被選中的成員(所有成員共用一塊地址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。 2. 對(duì)于聯(lián)合的不同成員賦值,&
17、#160;將會(huì)對(duì)其它成員重寫, 原來成員的值就不存在了, 而對(duì)于結(jié)構(gòu)的不同成員賦值是互不影響的19.簡(jiǎn)述數(shù)組與指針的區(qū)別? 解析:數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。 指針可以隨時(shí)指向任意類型的內(nèi)存塊。 (1)修改內(nèi)容上的差別char a = “hello”; a0 = X; char *p = “world”; /
18、 注意p 指向常量字符串 p0 = X; / 編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤 (2) 用運(yùn)算符sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。 sizeof(p),p 為指針得到的是一個(gè)指針變量的字節(jié)數(shù),而不是p 所指的內(nèi)存容量。 C+/C 語(yǔ)言沒有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請(qǐng)內(nèi)存時(shí)記住它。 注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動(dòng)退化為同類型的指針。 char a
19、= "hello world" char *p = a; cout<< sizeof(a) << endl; / 12 字節(jié) cout<< sizeof(p) << endl; / 4 字節(jié) 計(jì)算數(shù)組和指針的內(nèi)存容量 void Func(char a1
20、00) cout<< sizeof(a) << endl; / 4 字節(jié)不是100 字節(jié) 20.如何判斷一段程序是由C 編譯程序還是由C+編譯程序編譯的? 解析:#ifdef _cplusplus cout<<"c+" #else cout<<"c" #endif 21
21、.main 主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說明? 解析:可以,可以用_onexit 注冊(cè)一個(gè)函數(shù),它會(huì)在main 之后執(zhí)行int fn1(void), fn2(void), fn3(void), fn4 (void); void main( void ) String str("zhanglin"); _onexit( fn1 ); _onexit(
22、0;fn2 ); _onexit( fn3 ); _onexit( fn4 ); printf( "This is executed first.n" ); int fn1() printf( "next.n" );return 0; int fn2()printf( "executed
23、60;" ); return 0; int fn3() printf( "is " ); return 0; int fn4() printf( "This " ); return 0; 22.int idsizeof(unsigned long); 這個(gè)對(duì)嗎?為什么?解析:對(duì),這個(gè) sizeof是編
24、譯時(shí)運(yùn)算符,編譯時(shí)就確定了可以看成和機(jī)器有關(guān)的常量。23.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)?解析:cout << _FILE_ ;cout<<_LINE_ ;_FILE_和_LINE_是系統(tǒng)預(yù)定義宏,這種宏并不是在某個(gè)文件中定義的而是由編譯器定義的24.以下函數(shù)能求出數(shù)組的長(zhǎng)度嗎?void fun(char str)int len = sizeof(str)/sizeof(str0);解析:不能,數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),數(shù)組名被退化為指針,因此函數(shù)中的sizeof(str)實(shí)際是在求一個(gè)指針的sizeof,答案為4,因此不能計(jì)算出數(shù)組的長(zhǎng)度。25. 輸
25、出的結(jié)果是多少,并分析過程? unsigned short A = 10;printf(“%un”, A);char ch = 128;printf(“%dn”, ch);答:A=4294967285,首先將A轉(zhuǎn)化為int類型,即對(duì)應(yīng)的二進(jìn)制數(shù)值為:00000000 00000000 00000000 00001010,A=11111111 11111111 11111111 11110101,其實(shí)這種情況最高位是1,認(rèn)為是負(fù)數(shù),但是在輸出中指定以無符號(hào)數(shù)輸出,于是結(jié)果為4294967285=4294967295(四字節(jié)表示的最大數(shù))-10.ch = 128對(duì)應(yīng)的二進(jìn)制為:10000000,在
26、輸出中以整數(shù)形式輸出,由于最高位是1,于是就是負(fù)數(shù),10000000是該負(fù)數(shù)的補(bǔ)碼,根據(jù)求補(bǔ)碼的反步驟計(jì)算,先-1,得到01111111,在取反得10000000=128,由于本身是負(fù)數(shù),即為-128.26. New delete 與malloc free 的聯(lián)系與區(qū)別?解析:都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內(nèi)存操作。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)數(shù)并且不能初始化對(duì)象,new 會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。delete 會(huì)調(diào)用對(duì)象的destructor,而free 不會(huì)調(diào)用對(duì)象的destructor.27.用變量a給出下面的定義 (特別重要)a) 一個(gè)整型數(shù)(An
27、160;integer) b) 一個(gè)指向整型數(shù)的指針(A pointer to an integer) c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer) d) 一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers) e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型
28、數(shù)的(An array of 10 pointers to integers) f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers) g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù) 解析:a) int a; / An integer b) int *a; /
29、160;A pointer to an integer c) int *a; / A pointer to a pointer to an integer d) int a10; / An array of 10 integers e) int *a10; / An array
30、of 10 pointers to integers f) int (*a)10; / A pointer to an array of 10 integers g) int (*a)(int); / A pointer to a function a that takes an integer
31、160;argument and returns an integer h) int (*a10)(int);28.在不用第三方參數(shù)的情況下,交換兩個(gè)參數(shù)的值解析:方法1:#include <stdio.h> void main() int i=60; int j=50; i=i+j; j=i-j; i=i-j; printf("i=%d/n",i); printf("j=%d/n",j);方法二:i=j;j=i;i=j;、29.i最后等于多少? int i = 1; in
32、t j = i+; if(i>j+) && (i+ = j) i+=j;解析::i = 530.線程同步的機(jī)制有哪些?他們有什么優(yōu)缺點(diǎn)(可以說筆試必考)解析: 1.Critical Section A.速度快 B.不能用于不同進(jìn)程 C.不能進(jìn)行資源統(tǒng)計(jì)(每次只可以有一個(gè)線程對(duì)共享資源進(jìn)行存取)2.Mutex A.速度慢 B.可用于不同進(jìn)程 C.不能進(jìn)行資源統(tǒng)計(jì)3.Semaphore A.速度慢 B.可用于不同進(jìn)程 C.可進(jìn)行資源統(tǒng)計(jì)(可以讓一個(gè)或超過一個(gè)線程對(duì)共享資源進(jìn)行存取)4.Event A.速度慢 B.可用于不同進(jìn)程 C.可進(jìn)行資源統(tǒng)計(jì)31.指針和引用的區(qū)別?解析:
33、引用是在C+中引入的。它們之間的區(qū)別有:(1) 非空區(qū)別:指針可以為空,而引用不能為空(2)可修改區(qū)別:如果指針不是常指針,那么就可以修改指向,而引用不能(3) 初始化區(qū)別:指針定義時(shí)可以不初始化,而引用在定義的時(shí)必須初始化32.全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中 為什么 解析:可以,在不同的C文件中以static形式來聲明同名全局變量。 可以在不同的C文件中聲明同名的全局變量, 前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)33.結(jié)構(gòu)struct和類class有什么異同?
34、解析:在c語(yǔ)言中struct只能對(duì)數(shù)據(jù)進(jìn)行聚合,而c+的class把數(shù)據(jù)以及對(duì)數(shù)據(jù)的處理方法也同時(shí)聚合為一體,增加了內(nèi)聚性。 此外class擁有可再生性和可抽象性,實(shí)現(xiàn)的代碼的復(fù)用。集中體現(xiàn)在派生的功能和多態(tài)的功能。 同時(shí)class也比struct具備更好的封裝性,體現(xiàn)在三種訪問權(quán)限上。 在C+ 中的struct和class的結(jié)構(gòu)基本一致,只是struct的默認(rèn)權(quán)限為Public而class為private。 34. 邏輯思維題:101個(gè)硬幣100真、1假,真假區(qū)別在于重量。請(qǐng)用無砝碼天平稱兩次給出真幣重還是假幣重的結(jié)論。(貌似是華為的題)解析
35、:101個(gè)先取出2堆,33,33第一次稱,如果不相等,說明有一堆重或輕那么把重的那堆拿下來,再放另外35個(gè)中的33如果相等,說明假的重,如果不相等,新放上去的還是重的話,說明假的輕(不可能新放上去的輕)第一次稱,如果相等的話,這66個(gè)肯定都是真的,從這66個(gè)中取出35個(gè)來,與剩下的沒稱過的35個(gè)比下面就不用說了35.char str1=”abc”; char str2 = “abc”; str1=str2正確嗎:解析:錯(cuò)誤,因?yàn)閟tr1和str2是位于堆棧上的,它們占用不同的內(nèi)存空間。Const char str3 = “abc”; const char str4 = “abc”;str3=s
36、tr4為FALSE,同樣它們是位于堆棧上的內(nèi)存空間,是不同的。Const char *str5=”abc”, const char *str6=”abc”;char *str7=”abc”,char *str8 = “abc”,str5=str6 str7=str8為TRUE,因?yàn)椤盿bc”是位于文字常量區(qū)的,系統(tǒng)將幾個(gè)“abc”進(jìn)行優(yōu)化,使它們位于同一塊內(nèi)存區(qū),因此指針的指向也就相同了。36.內(nèi)聯(lián)函數(shù)和宏的差別?答:內(nèi)聯(lián)函數(shù)和普通函數(shù)相比可以加快程序運(yùn)行的速度,因?yàn)椴恍枰袛嗾{(diào)用,在編譯的時(shí)候內(nèi)聯(lián)函數(shù)可以直接被鑲嵌到目標(biāo)代碼中,而宏只是一個(gè)簡(jiǎn)單的替換。內(nèi)聯(lián)函數(shù)要做參數(shù)類型檢查,這是與宏相比的
37、優(yōu)勢(shì)。Inline是指嵌入代碼,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn),而是把代碼直接寫到那里去。對(duì)于短小的代碼來說,inline可以帶來一定效率的提升,而且和C時(shí)代的宏函數(shù)相比,inline更安全可靠。可是這是以增加空間消耗為代價(jià)的。Inline一般只適用于:一個(gè)函數(shù)被不斷地重復(fù)調(diào)用;函數(shù)只有簡(jiǎn)單的幾行,且函數(shù)內(nèi)不能含有for while switch語(yǔ)句。37.delete與 delete 區(qū)別 delete只會(huì)調(diào)用一次析構(gòu)函數(shù),而delete會(huì)調(diào)用每一個(gè)成員的析構(gòu)函數(shù)。在More Effective C+中有更為詳細(xì)的解釋:“當(dāng)dele
38、te操作符用于數(shù)組時(shí),它為每個(gè)數(shù)組元素調(diào)用析構(gòu)函數(shù),然后調(diào)用operatordelete來釋放內(nèi)存?!眃elete與New配套,delete 與new 配套 38.求下面函數(shù)的返回值(微軟) int func(x) int countx = 0; while(x)
39、0; countx +; x = x&(x-1); return countx; 假定x = 9999。 解析:返回值是8思路:將x轉(zhuǎn)化為2進(jìn)制,看含有的1的個(gè)數(shù)39. 下面程序的結(jié)果是多少?P1=(unsigned char
40、60;*)0x801000; p2=(unsigned long *)0x810000; 請(qǐng)問p1+5= p2+5= 解析:0x801005(相當(dāng)于加上5位) 0x810014(相當(dāng)于加上20位); 40. 下面的代碼輸出是什么,為什么? void foo(void) unsigned int a = 6; int b = -20; (a
41、+b > 6) ? puts("> 6") : puts("<= 6");解析:這個(gè)問題測(cè)試你是否懂得C語(yǔ)言中的整數(shù)自動(dòng)轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不管如何,這無符號(hào)整型問題的答案是輸出是 ">6"。原因是當(dāng)表達(dá)式中存在有符號(hào)類型和無符號(hào)類型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無符號(hào)類型。因此-20變成了一個(gè)非常大的正整數(shù),所以該表達(dá)式 計(jì)算出的結(jié)果大于6。這一點(diǎn)對(duì)于應(yīng)當(dāng)頻繁用到無符號(hào)數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。如果你答錯(cuò)了這個(gè)問題,你也就到了得不到這份工作的邊緣。 41 TCP/IP 建立連接
42、的過程?(通信公司考得比較多)答:在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);第二次握手:服務(wù)器收到syn包必須確認(rèn)客戶的SYN(ack=j+1)同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);第三次握手:客戶端收到服務(wù)器的SYNACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。42.求下面函數(shù)的返回值(微軟)int func(
43、x)int countx = 0;while(x)countx +;x = x&(x-1);return countx; 假定x = 9999。 答案:8解析:將x轉(zhuǎn)化為2進(jìn)制,看含有的1的個(gè)數(shù)。知道了這是統(tǒng)計(jì)9999的二進(jìn)制數(shù)值中有多少個(gè)1的函數(shù),且有99999×1024512256159×1024中含有1的個(gè)數(shù)為2;512中含有1的個(gè)數(shù)為1;256中含有1的個(gè)數(shù)為1;15中含有1的個(gè)數(shù)為4;故共有1的個(gè)數(shù)為8,結(jié)果為8。1000 - 1 = 0111,正好是原數(shù)取反。這就是原理。用這種方法來求1的個(gè)數(shù)是很效率很高的。不必去一個(gè)一個(gè)地移位。循環(huán)次數(shù)最少。43. C
44、語(yǔ)言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 解析:這個(gè)問題將做為這個(gè)測(cè)驗(yàn)的一個(gè)愉快的結(jié)尾。不管你相不相信,上面的例子是完全合乎語(yǔ)法的。根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成: c = a+ + b; 因此, 這段代碼持行后a = 6, b = 7, c = 12。 如果你不知道答案,我也不把這個(gè)當(dāng)作問題。我發(fā)現(xiàn)這個(gè)問題的最大好處是:這是一個(gè)關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題44請(qǐng)寫出下面代碼在 32 位平臺(tái)上的運(yùn)行結(jié)果,并說明 sizeof 的性質(zhì)
45、:#include <stdio.h>#include <stdlib.h>int main(void) char a30; char *b = (char *)malloc(20 * sizeof(char); printf("%dn", sizeof(a);/1 printf("%dn", sizeof(b);/2 printf("%dn", sizeof(a3);/3 printf("%dn", sizeof(b+3);/4 printf("%dn", sizeof
46、(*(b+4);/5 return 0 ;45. 在C+ 程序中調(diào)用被 C 編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?解析:函數(shù)和變量被C+編譯后在符號(hào)庫(kù)中的名字與C語(yǔ)言的不同,被extern "C"修飾的變量和函數(shù)是按照C語(yǔ)言方式編譯和連接的。由于編譯后的名字不同,C+程序不能直接調(diào)用C 函數(shù)。C+提供了一個(gè)C 連接交換指定符號(hào)extern“C”來解決這個(gè)問題。46.下面函數(shù)的運(yùn)行結(jié)果是什么?main() int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1
47、),*(ptr-1);解析:2,5*(a+1)就是a1,*(ptr-1)就是a4, 執(zhí)行結(jié)果是2, 5。&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int)。int *ptr=(int *)(&a+1); 則ptr實(shí)際是&(a5),也就是a+547、設(shè)有以下說明和定義:typedef union long i; int k5; char c; DATE;struct data int cat; DATE cow; double dog; too;DATE max;則語(yǔ)句 printf("%d",sizeof
48、(too)+sizeof(max);的執(zhí)行結(jié)果是:_解析:DATE是一個(gè)union, 變量公用空間. 里面最大的變量類型是int5, 占用20個(gè)字節(jié). 所以它的大小是20,data是一個(gè)struct, 每個(gè)變量分開占用空間. 依次為int4 + DATE20 + double8 = 32.所以結(jié)果是 20 + 32 = 52.48.下面的代碼有什么作用?#ifndef _INCvxWorksh#define _INCvxWorksh#ifdef _cplusplusextern "C" #endif /* */ #ifdef _cplusplus #endif#endif
49、/* _INCvxWorksh */解析:頭文件中的編譯宏#ifndef_INCvxWorksh#define_INCvxWorksh#endif 的作用是防止被重復(fù)引用。49. 解析8進(jìn)制的結(jié)果是33305 10進(jìn)制的結(jié)果是14021 16進(jìn)制的結(jié)果是36C550:下列代碼運(yùn)行后得到的結(jié)果是多少(耐為數(shù)控)?#define SQLARE(a) (a)*(a)Int a = 5;Int b;B = SQLARE(a+);解析:代碼預(yù)編譯后的 b = (a+)*(a+); 后+理解為遇到分好才+,結(jié)果為2551:下列程序運(yùn)行后a的值是多少? 為什么? Unsigned int a = 100;
50、Unsigned int i; For(i=100;i >=0.;i-) a+;解析: 由于i是無符號(hào)型的int類型,值永遠(yuǎn)不可能小于0,所以循環(huán)i>=0永遠(yuǎn)成立.52:下列程序的運(yùn)行結(jié)果是什么? 為什么? void foo(void) Unsigned int a = 6; Int b = -20; (a+b>6)?puts(“>6”):puts(“<=6”);解析:由于a是無符號(hào)型的,有符號(hào)的和無符號(hào)的相加會(huì)都變成無符號(hào)的.結(jié)果是>653:要求設(shè)置一絕對(duì)地址為0x67a9的整形變量的值為0xaa66.編譯器是一個(gè)純粹的asc編輯器, 解析: Int *
51、p; p =(int*) 0x67a9; *p = 0xaa66;54:邏輯思維題:有一種小蟲,每隔2秒分裂一次,分裂后的2只小蟲經(jīng)過2秒后又會(huì)分裂一次,如果最初命中只有一只小蟲,那么2秒后變2只,再經(jīng)過2秒后變成4只,。兩分鐘后正好滿滿一瓶小蟲,假設(shè)這個(gè)瓶中最初放兩只小蟲請(qǐng)問,經(jīng)過多少時(shí)間后正巧也是滿滿的一瓶?為什么? 解析:其實(shí)很簡(jiǎn)單,就是前面兩秒的時(shí)候本來從一個(gè)分裂兩個(gè)要兩秒,而第二種情況直接兩個(gè)等于前面的兩秒省略了,所以時(shí)間是一份五十八秒2.0次方=1(這個(gè)是第一個(gè)起點(diǎn))2.1次方=2(這個(gè)是第二個(gè)起點(diǎn))2.3次方=4第二次比第一個(gè)少分裂一次.同樣2個(gè)小蟲就是分裂1分58秒.55. I
52、f(n=8)和if(8 = n) 的區(qū)別,哪一個(gè)好?為什么(大唐)解析:第一種是把把常量放比較符后面,后者相反,第二種好處是if(8=n)編譯器會(huì)報(bào)錯(cuò)56 線程和進(jìn)程的區(qū)別: 57:測(cè)試分為哪幾類? 解析: 針對(duì)系統(tǒng)功能的測(cè)試叫做黑盒測(cè)試 測(cè)試函數(shù)功能函數(shù)的接口等叫做白盒測(cè)試58;sizeof和strlen的區(qū)別:解析:1.sizeof的結(jié)果類型是size_t,它在頭文件中typedef為unsigned int類型。 該類型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。 2.sizeof是算符,strlen是函數(shù)。 3.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),。4.數(shù)組
53、做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了。 5在編譯的時(shí)候就把sizeof計(jì)算過了 是類型或是變量的長(zhǎng)度這就是0;6.strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,不是類型占內(nèi)存的大小。 7.sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧。8.當(dāng)適用了于一個(gè)結(jié)構(gòu)類型時(shí)或變量, sizeof 返回實(shí)際的大小,59. const和#define都是代表不可改變的,他們有什么不一樣呢? 解析: const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對(duì)const修飾的數(shù)據(jù)進(jìn)行類型安全檢查。而對(duì)宏常量只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換時(shí)可能會(huì)產(chǎn)生意料
54、不到的錯(cuò)誤。 有些集成化的調(diào)試工具可以對(duì)const 常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試。60. 堆棧溢出一般是什么原因?qū)е碌??解析:沒有回收垃圾資源,比如:malloc的內(nèi)存沒有回收,遞歸調(diào)用層次太深,沒有退出處理61什么是預(yù)編譯,什么時(shí)候需要預(yù)編譯。62. 用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的功能,怎實(shí)現(xiàn),說出具體的思路解析:63在桌面上有一堆硬幣,其中有十三枚正面向上,其他的硬幣都是反面向下,硬幣大小形狀都一樣,你閉上眼睛(無其他人,工具幫助),用手將硬幣分成兩堆,使兩堆正面朝上的數(shù)目相等.請(qǐng)問你有什么辦法?(華為) 解析:方法一:把硬幣分成兩堆,把兩堆都豎起來,沒有正面朝上的 哈哈哈。
55、還有其他辦法。64 小明一家過一座橋,過橋時(shí)是黑夜,所以必須有燈?,F(xiàn)在小明過橋要1秒, 小明的弟弟要3秒,小明的爸爸要6秒,小明的媽媽要8秒,小明的爺爺要12秒。每次此橋最多可過兩人,而過橋的速度依過橋最慢者而定,而且燈在點(diǎn)燃后30秒就會(huì) 熄滅。問:小明一家如何過橋?(中科院)解析:第一步,小明與弟弟過橋,小明回來,耗時(shí)秒;第二步,小明與爸爸過河,弟弟回來,耗時(shí)秒;第三步,媽媽與爺爺過河,小明回來,耗時(shí)秒;最后,小明與弟弟過河,耗時(shí)秒,總共耗時(shí)秒,多么驚險(xiǎn)!65(北京贊同科技) 現(xiàn)有1100共一百個(gè)自然數(shù),已隨機(jī)放入一個(gè)有98個(gè)元素的數(shù)組a98。要求寫出一個(gè)盡量簡(jiǎn)單的方案,找出沒有被放入數(shù)組的
56、那2個(gè)數(shù),并在屏幕上打印這2個(gè)數(shù)。注意:程序不用實(shí)現(xiàn)自然數(shù)隨機(jī)放入數(shù)組的過程。 解析: /a98中存放著原數(shù)組;int i=0;unsigned char b100;for(i=0;i<100;i+) bi=0;/依次填入b100,b0=1,b1=2,b2=3,.for(i=0;i<98;i+) bai-1=ai;/沒有被填入數(shù)字的應(yīng)該還是0,bn=0for(i=0;i<100;i+) if(0=bi) printf("num:%d n",(i+1);66. 簡(jiǎn)單說明TCP與UDP的區(qū)別 解析:1。TCP是基于連
57、接的,UDP是基于無連接 2。對(duì)系統(tǒng)資源的要求(TCP較多,UDP少) 3。UDP程序結(jié)構(gòu)較簡(jiǎn)單 4。流模式與數(shù)據(jù)報(bào)模式 5。TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證67. 鍵字volatile有什么含意?并給出三個(gè)不同的例子。解析:一個(gè)定義為volatile的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子: 1) 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 2) 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非
58、自動(dòng)變量 3) 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量 補(bǔ)充問題:1) 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么??梢?。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。2) 一個(gè)指針可以是volatile 嗎?解釋為什么??梢?。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。68. C和C+有什么不同?解析: 從機(jī)制上:c是面向過程的(但c也可以編寫面向?qū)ο蟮某绦颍籧+是面向?qū)ο蟮?,提供了類。但是,c+編寫面向?qū)ο蟮某绦虮萩容易 從適用的方向:c適合要求代碼體積小的,效
59、率高的場(chǎng)合,如嵌入式;c+適合更上層的,復(fù)雜的;linux核心大部分是c寫的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。 C語(yǔ)言是結(jié)構(gòu)化編程語(yǔ)言,C+是面向?qū)ο缶幊陶Z(yǔ)言。C+側(cè)重于對(duì)象而不是過程,側(cè)重于類的設(shè)計(jì)而不是邏輯的設(shè)計(jì)。69 main 主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說明? 解析:可以,可以用_onexit 注冊(cè)一個(gè)函數(shù),它會(huì)在main 之后執(zhí)行int fn1(void),Int main( void )String str("zhanglin");_onexit( fn1 );printf( "This is executed first.n&qu
60、ot; );int fn1()printf( "next.n" );return 0;70 101個(gè)硬幣100真、1假,真假區(qū)別在于重量。請(qǐng)用無砝碼天平稱兩次給出真幣重還是假幣重的結(jié)論。解析: 第一步:把硬幣分為三堆兒(50,50,1),先拿兩個(gè)50 放天平比較,如果相等,說明單個(gè)的就是假的,再隨便拿一個(gè)真硬幣和這個(gè)假硬幣放天平比較一下就可得到結(jié)果。第二步:如果第一步的兩個(gè)50 比較后不相等,此時(shí)一端50重,一端50輕。如果拿輕的一端50,分成兩堆(25,25) 放到天平上,如果這兩個(gè)25相等,則假硬幣(重)在重的一端50里,否 則(不相等)假硬幣(輕)在這兩個(gè)(25,25
61、)里,也就是輕的一端50里。71. 變量的聲明和定義有什么區(qū)別?解析:2. 一個(gè)變量的定義會(huì)為變量分配存儲(chǔ)空間,也有可能同時(shí)為其提供初始值;3. 聲明則僅給出變量的數(shù)據(jù)類型和變量名稱;4. 變量的定義肯定也是變量的聲明,反之則未必;5. 在作用域內(nèi),變量的定義有且僅有一個(gè),聲明則可以有多個(gè);6. 有extern的時(shí)候,兩者的情況區(qū)分:72下列代碼:char * GetStr()char *tmp;tmp = "123"return tmp;void main()printf("%s", GetStr();
62、會(huì)輸出123嗎?123創(chuàng)建在堆上還是棧上呢?123的空間是什么時(shí)候釋放的? 解析:可以輸出123,首先123是一個(gè)字符串常量,存儲(chǔ)在只讀常量區(qū), 在函數(shù)調(diào)用完成之后不會(huì)被釋放,他的生命周期是程序開始到程序結(jié)束, 他既不是在堆上也不是在棧上。73 關(guān)鍵字volatile有什么含意 并給出三個(gè)不同的例子。 解析:一個(gè)定義為volatile的變量是說這變量可能會(huì)被意想不到地改變,這樣, 編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必 須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。 下面是volatile變量的幾個(gè)例子: 1). 并行設(shè)備的硬件寄存器(如
63、:狀態(tài)寄存器) 2). 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables) 3). 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量 74 C語(yǔ)言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 解析:上面的例子是完全合乎語(yǔ)法的。問題是編譯器如何處理它? 水平不高的編譯作者實(shí)際上會(huì)爭(zhēng)論這個(gè)問題,根據(jù)最處理原則, 編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成: c = a+ + b; 因此, 這段代碼持行后a = 6, b = 7, c = 12。 75.在8086 匯編下,邏輯
64、地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄存器內(nèi)地址,就得到了真正要訪問的地址。76 Itearator和指針的區(qū)別是什么? 解析:游標(biāo)和指針,游標(biāo)是指針,但不僅僅是指針。游標(biāo)和指針很像,功能很像指針,但是實(shí)際上,游標(biāo)是通過重載一元的”*”和”->”來從容器中間接地返回一個(gè)值。將這些值存儲(chǔ)在容器中并不是一個(gè)好主意,因?yàn)槊慨?dāng)一個(gè)新值添加到容器中或者有一個(gè)值從容器中刪除,這些值就會(huì)失效。在某種程度上,游標(biāo)可以看作是句柄(handle)。通常情況下游標(biāo)(iterator)的類型可以有所變化,這樣容器也會(huì)有幾種不同方式的轉(zhuǎn)變:iterator對(duì)于除了vector以外的其他任何容器,你可以通過這種游標(biāo)在一次操作中在容器中朝向前的方向走一步。這意味著對(duì)于這種游標(biāo)你只能使用“+”操作符。而不能使用“-”或“+=”操作符。而對(duì)于vector這
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度美團(tuán)團(tuán)購(gòu)服務(wù)合同范本升級(jí)版8篇
- 二零二五年度高空作業(yè)腳手架租賃與施工總承包合同3篇
- 2025版協(xié)議離婚特殊規(guī)定及婚姻財(cái)產(chǎn)分割與子女撫養(yǎng)合同3篇
- 2025版臨時(shí)工特殊工種作業(yè)安全協(xié)議書4篇
- 2025年度酒店式公寓房間長(zhǎng)期租賃服務(wù)協(xié)議3篇
- 2025年度個(gè)人企業(yè)全額承包經(jīng)營(yíng)合作協(xié)議范本4篇
- 2025年度新能源電池殼體模具開發(fā)與加工服務(wù)協(xié)議4篇
- 2025年度文化創(chuàng)意園區(qū)場(chǎng)地租賃安全管理與文化創(chuàng)新合同4篇
- 水電消防工程2025年度施工及進(jìn)度管理合同2篇
- 2025新生入學(xué)教育法律協(xié)議書(定制版)2篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 二手車車主寄售協(xié)議書范文范本
- 窗簾采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語(yǔ)文單元整體教學(xué)設(shè)計(jì)策略的探究
- 人教版高中物理必修一同步課時(shí)作業(yè)(全冊(cè))
- 食堂油鍋起火演練方案及流程
- 《呼吸衰竭的治療》
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識(shí)點(diǎn)總結(jié)(重點(diǎn)標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論