標(biāo)準(zhǔn)c語言筆試題精華完結(jié)版_第1頁
標(biāo)準(zhǔn)c語言筆試題精華完結(jié)版_第2頁
標(biāo)準(zhǔn)c語言筆試題精華完結(jié)版_第3頁
標(biāo)準(zhǔn)c語言筆試題精華完結(jié)版_第4頁
標(biāo)準(zhǔn)c語言筆試題精華完結(jié)版_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 C試題講解問答題部分:(面試中問到的內(nèi)容)1. 局部變量能否和全局變量重名? (華為) 解析:能,局部會屏蔽全局。要用全局變量,需要使用":" 局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個變量時(shí),會用到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部變量.比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環(huán)體內(nèi)。3. 如何引用一個已經(jīng)定義過的全局變量? (華為)解析:extern 可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變

2、理,假定你將那個編寫錯了,那么在編譯期間會報(bào)錯,如果你用extern方式引用時(shí),假定你犯了同樣的錯誤,那么在編譯期間不會報(bào)錯,而在連接期間報(bào)錯。4. static全局變量與普通的全局變量有什么區(qū)別?解析:1) 全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式從以上分析可以看出, static全局變量與普通的全局變量有什么區(qū)別: static全局變量只初使化一次,防止在其他文件單元中被引用; static局部變量和普通局部變量有什么區(qū)別: 

3、;static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值; static函數(shù)與普通函數(shù)有什么區(qū)別: static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝5. 進(jìn)程和線程的差別(微軟亞洲)解析:答:線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體. 與進(jìn)程的區(qū)別: (1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位 (2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個進(jìn)程的多個線程之間也可并發(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)常改動的大型代

5、碼體。 )、程序由多個模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個預(yù)編譯頭。8. 下述三個有什么區(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),括號優(yōu)先;比如:從a符號開始。其右邊是10,說明a是個數(shù)組,其中存了十個元素。再看a的左邊是一個*。說明數(shù)組中存的是指針?,F(xiàn)在在看(*a10)的右邊是(int);說明所存的指針是指向有一個int形

7、參的函數(shù)現(xiàn)在看(*a10)的左邊是個int ,說明指向的函數(shù)的返回值為int 類型;10. 進(jìn)程之間通信的途徑,進(jìn)程間通信方法(慧通)解析:無名管道,命名管道,消息隊(duì)列,信號,共享內(nèi)存,套接字。等11. 什么是“引用”?申明和使用“引用”要注意哪些問題?解析:引用就是某個目標(biāo)變量的“別名”(alias),對應(yīng)用的操作與對變量直接操作效果完全相同。申明一個引用的時(shí)候,切記要對其進(jìn)行初始化。引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個名稱,即該目標(biāo)原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標(biāo)變量名的一個別名,它本身不是一種數(shù)據(jù)類型,因此

8、引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。不能建立數(shù)組的引用12.include <filename.h>和include “filename.h”的區(qū)別?解析:<>是從標(biāo)準(zhǔn)庫路徑搜索, “”是從用戶當(dāng)前工作目錄開始,找不到,在到標(biāo)準(zhǔn)庫開始13.Heap和Stack的區(qū)別?解析:Heap是堆,Stack是棧。 棧的空間由操作系統(tǒng)自動分配和回收,而堆上的空間由程序員申請和釋放。 棧的空間大小較小,而堆的空間較大。 棧的地址空間往低地址方向生長,而堆向高地址方向生長。 棧的存取效率更高。 程序在編譯期間對變量和函數(shù)的內(nèi)存分配都在棧上, 且程序運(yùn)行過程中對函數(shù)調(diào)用中參

9、數(shù)的內(nèi)存分配也是在棧上。14.sizeof和strlen之間的區(qū)別?解析:(1)sizeof操作符的結(jié)果類型是size_t,它在頭文件中的typedef為unsigned int類型,該類型保證能容納實(shí)現(xiàn)所建立的最大對象的字節(jié)大小。 (2)sizeof是運(yùn)算符,strlen是函數(shù) (3)sizeof可以用類型做參數(shù),strlen只能用char *做參數(shù),且必須是以0結(jié)尾的。 (4)數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針。 (5)大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過了是類型或是變量的長度。 (6)strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,用來計(jì)算字符串的長

10、度,而不是類型占用內(nèi)存的大小。 (7)sizeof后如果是類型必須加括號,如果是變量名可以不加括號。 (8)當(dāng)使用了一個結(jié)構(gòu)類型或變量時(shí),sizeof返回實(shí)際的大小。 (9)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址。 (10)計(jì)算結(jié)構(gòu)變量的大小就必須討論數(shù)組對齊問題。 (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      解析 請問hash(16),hash(256)的值分別是:      17.bool double int float.各種類型與0值的比較(概率較大)解析:請寫出 BOOL flag 與“零值”比較的 if 語句。if ( flag ) 或者&

12、#160;   if ( !flag ) 如下寫法均屬不良風(fēng)格,不得分。     if (flag = TRUE)        if (flag = 1 )          if (flag = 

13、FALSE)          if (flag = 0) 請寫出 float  x 與“零值”比較的 if 語句。(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)化成“>=”或“<=”此類形式如下是錯誤的寫法,不得分。     if (x = 0.0)        if (x != 0.0)        請寫出 char *p 與“

15、零值”比較的 if 語句。(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)合都是由多個不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 聯(lián)合中只存放了一個被選中的成員(所有成員共用一塊地址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。 2.  對于聯(lián)合的不同成員賦值,&

17、#160;將會對其它成員重寫,  原來成員的值就不存在了, 而對于結(jié)構(gòu)的不同成員賦值是互不影響的19.簡述數(shù)組與指針的區(qū)別?     解析:數(shù)組要么在靜態(tài)存儲區(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)該錯誤,運(yùn)行時(shí)錯誤      (2) 用運(yùn)算符sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。 sizeof(p),p 為指針得到的是一個指針變量的字節(jié)數(shù),而不是p 所指的內(nèi)存容量。 C+/C 語言沒有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請內(nèi)存時(shí)記住它。 注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動退化為同類型的指針。  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í)行完畢后,是否可能會再執(zhí)行一段代碼,給出說明? 解析:可以,可以用_onexit 注冊一個函數(shù),它會在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); 這個對嗎?為什么?解析:對,這個 sizeof是編

24、譯時(shí)運(yùn)算符,編譯時(shí)就確定了可以看成和機(jī)器有關(guān)的常量。23.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號?解析:cout << _FILE_ ;cout<<_LINE_ ;_FILE_和_LINE_是系統(tǒng)預(yù)定義宏,這種宏并不是在某個文件中定義的而是由編譯器定義的24.以下函數(shù)能求出數(shù)組的長度嗎?void fun(char str)int len = sizeof(str)/sizeof(str0);解析:不能,數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),數(shù)組名被退化為指針,因此函數(shù)中的sizeof(str)實(shí)際是在求一個指針的sizeof,答案為4,因此不能計(jì)算出數(shù)組的長度。25. 輸

25、出的結(jié)果是多少,并分析過程? unsigned short A = 10;printf(“%un”, A);char ch = 128;printf(“%dn”, ch);答:A=4294967285,首先將A轉(zhuǎn)化為int類型,即對應(yīng)的二進(jìn)制數(shù)值為:00000000 00000000 00000000 00001010,A=11111111 11111111 11111111 11110101,其實(shí)這種情況最高位是1,認(rèn)為是負(fù)數(shù),但是在輸出中指定以無符號數(shù)輸出,于是結(jié)果為4294967285=4294967295(四字節(jié)表示的最大數(shù))-10.ch = 128對應(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)行動態(tài)的內(nèi)存操作。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)數(shù)并且不能初始化對象,new 會自動調(diào)用對象的構(gòu)造函數(shù)。delete 會調(diào)用對象的destructor,而free 不會調(diào)用對象的destructor.27.用變量a給出下面的定義 (特別重要)a) 一個整型數(shù)(An&#

27、160;integer) b) 一個指向整型數(shù)的指針(A pointer to an integer) c) 一個指向指針的的指針,它指向的指針是指向一個整型數(shù)(A pointer to a pointer to an integer) d) 一個有10個整型數(shù)的數(shù)組(An array of 10 integers) e) 一個有10個指針的數(shù)組,該指針是指向一個整型

28、數(shù)的(An array of 10 pointers to integers) f) 一個指向有10個整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers) g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(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ù)的情況下,交換兩個參數(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ì)(每次只可以有一個線程對共享資源進(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ì)(可以讓一個或超過一個線程對共享資源進(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.全局變量可不可以定義在可被多個.C文件包含的頭文件中 為什么   解析:可以,在不同的C文件中以static形式來聲明同名全局變量。   可以在不同的C文件中聲明同名的全局變量, 前提是其中只能有一個C文件中對此變量賦初值,此時(shí)連接不會出錯33.結(jié)構(gòu)struct和類class有什么異同? 

34、解析:在c語言中struct只能對數(shù)據(jù)進(jìn)行聚合,而c+的class把數(shù)據(jù)以及對數(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個硬幣100真、1假,真假區(qū)別在于重量。請用無砝碼天平稱兩次給出真幣重還是假幣重的結(jié)論。(貌似是華為的題)解析

35、:101個先取出2堆,33,33第一次稱,如果不相等,說明有一堆重或輕那么把重的那堆拿下來,再放另外35個中的33如果相等,說明假的重,如果不相等,新放上去的還是重的話,說明假的輕(不可能新放上去的輕)第一次稱,如果相等的話,這66個肯定都是真的,從這66個中取出35個來,與剩下的沒稱過的35個比下面就不用說了35.char str1=”abc”; char str2 = “abc”; str1=str2正確嗎:解析:錯誤,因?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)將幾個“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)代碼中,而宏只是一個簡單的替換。內(nèi)聯(lián)函數(shù)要做參數(shù)類型檢查,這是與宏相比的

37、優(yōu)勢。Inline是指嵌入代碼,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn),而是把代碼直接寫到那里去。對于短小的代碼來說,inline可以帶來一定效率的提升,而且和C時(shí)代的宏函數(shù)相比,inline更安全可靠。可是這是以增加空間消耗為代價(jià)的。Inline一般只適用于:一個函數(shù)被不斷地重復(fù)調(diào)用;函數(shù)只有簡單的幾行,且函數(shù)內(nèi)不能含有for while switch語句。37.delete與 delete 區(qū)別 delete只會調(diào)用一次析構(gòu)函數(shù),而delete會調(diào)用每一個成員的析構(gòu)函數(shù)。在More Effective  C+中有更為詳細(xì)的解釋:“當(dāng)dele

38、te操作符用于數(shù)組時(shí),它為每個數(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的個數(shù)39. 下面程序的結(jié)果是多少?P1=(unsigned char

40、60;*)0x801000; p2=(unsigned long *)0x810000; 請問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");解析:這個問題測試你是否懂得C語言中的整數(shù)自動轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 ">6"。原因是當(dāng)表達(dá)式中存在有符號類型和無符號類型時(shí)所有的操作數(shù)都自動轉(zhuǎn)換為無符號類型。因此-20變成了一個非常大的正整數(shù),所以該表達(dá)式 計(jì)算出的結(jié)果大于6。這一點(diǎn)對于應(yīng)當(dāng)頻繁用到無符號數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。 41 TCP/IP 建立連接

42、的過程?(通信公司考得比較多)答:在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個連接。第一次握手:建立連接時(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ā)送一個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的個數(shù)。知道了這是統(tǒng)計(jì)9999的二進(jìn)制數(shù)值中有多少個1的函數(shù),且有99999×1024512256159×1024中含有1的個數(shù)為2;512中含有1的個數(shù)為1;256中含有1的個數(shù)為1;15中含有1的個數(shù)為4;故共有1的個數(shù)為8,結(jié)果為8。1000 - 1 = 0111,正好是原數(shù)取反。這就是原理。用這種方法來求1的個數(shù)是很效率很高的。不必去一個一個地移位。循環(huán)次數(shù)最少。43. C

44、語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 解析:這個問題將做為這個測驗(yàn)的一個愉快的結(jié)尾。不管你相不相信,上面的例子是完全合乎語法的。根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成: c = a+ + b; 因此, 這段代碼持行后a = 6, b = 7, c = 12。 如果你不知道答案,我也不把這個當(dāng)作問題。我發(fā)現(xiàn)這個問題的最大好處是:這是一個關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題44請寫出下面代碼在 32 位平臺上的運(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+編譯后在符號庫中的名字與C語言的不同,被extern "C"修飾的變量和函數(shù)是按照C語言方式編譯和連接的。由于編譯后的名字不同,C+程序不能直接調(diào)用C 函數(shù)。C+提供了一個C 連接交換指定符號extern“C”來解決這個問題。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)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大小(本例是5個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;則語句 printf("%d",sizeof

48、(too)+sizeof(max);的執(zhí)行結(jié)果是:_解析:DATE是一個union, 變量公用空間. 里面最大的變量類型是int5, 占用20個字節(jié). 所以它的大小是20,data是一個struct, 每個變量分開占用空間. 依次為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是無符號型的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是無符號型的,有符號的和無符號的相加會都變成無符號的.結(jié)果是>653:要求設(shè)置一絕對地址為0x67a9的整形變量的值為0xaa66.編譯器是一個純粹的asc編輯器, 解析: Int *

51、p; p =(int*) 0x67a9; *p = 0xaa66;54:邏輯思維題:有一種小蟲,每隔2秒分裂一次,分裂后的2只小蟲經(jīng)過2秒后又會分裂一次,如果最初命中只有一只小蟲,那么2秒后變2只,再經(jīng)過2秒后變成4只,。兩分鐘后正好滿滿一瓶小蟲,假設(shè)這個瓶中最初放兩只小蟲請問,經(jīng)過多少時(shí)間后正巧也是滿滿的一瓶?為什么? 解析:其實(shí)很簡單,就是前面兩秒的時(shí)候本來從一個分裂兩個要兩秒,而第二種情況直接兩個等于前面的兩秒省略了,所以時(shí)間是一份五十八秒2.0次方=1(這個是第一個起點(diǎn))2.1次方=2(這個是第二個起點(diǎn))2.3次方=4第二次比第一個少分裂一次.同樣2個小蟲就是分裂1分58秒.55. I

52、f(n=8)和if(8 = n) 的區(qū)別,哪一個好?為什么(大唐)解析:第一種是把把常量放比較符后面,后者相反,第二種好處是if(8=n)編譯器會報(bào)錯56 線程和進(jìn)程的區(qū)別: 57:測試分為哪幾類? 解析: 針對系統(tǒng)功能的測試叫做黑盒測試 測試函數(shù)功能函數(shù)的接口等叫做白盒測試58;sizeof和strlen的區(qū)別:解析:1.sizeof的結(jié)果類型是size_t,它在頭文件中typedef為unsigned int類型。 該類型保證能容納實(shí)現(xiàn)所建立的最大對象的字節(jié)大小。 2.sizeof是算符,strlen是函數(shù)。 3.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),。4.數(shù)組

53、做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了。 5在編譯的時(shí)候就把sizeof計(jì)算過了 是類型或是變量的長度這就是0;6.strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,不是類型占內(nèi)存的大小。 7.sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧。8.當(dāng)適用了于一個結(jié)構(gòu)類型時(shí)或變量, sizeof 返回實(shí)際的大小,59. const和#define都是代表不可改變的,他們有什么不一樣呢? 解析: const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對const修飾的數(shù)據(jù)進(jìn)行類型安全檢查。而對宏常量只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換時(shí)可能會產(chǎn)生意料

54、不到的錯誤。  有些集成化的調(diào)試工具可以對const 常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。60. 堆棧溢出一般是什么原因?qū)е碌模拷馕觯簺]有回收垃圾資源,比如:malloc的內(nèi)存沒有回收,遞歸調(diào)用層次太深,沒有退出處理61什么是預(yù)編譯,什么時(shí)候需要預(yù)編譯。62. 用兩個棧實(shí)現(xiàn)一個隊(duì)列的功能,怎實(shí)現(xiàn),說出具體的思路解析:63在桌面上有一堆硬幣,其中有十三枚正面向上,其他的硬幣都是反面向下,硬幣大小形狀都一樣,你閉上眼睛(無其他人,工具幫助),用手將硬幣分成兩堆,使兩堆正面朝上的數(shù)目相等.請問你有什么辦法?(華為) 解析:方法一:把硬幣分成兩堆,把兩堆都豎起來,沒有正面朝上的 哈哈哈。

55、還有其他辦法。64 小明一家過一座橋,過橋時(shí)是黑夜,所以必須有燈?,F(xiàn)在小明過橋要1秒, 小明的弟弟要3秒,小明的爸爸要6秒,小明的媽媽要8秒,小明的爺爺要12秒。每次此橋最多可過兩人,而過橋的速度依過橋最慢者而定,而且燈在點(diǎn)燃后30秒就會 熄滅。問:小明一家如何過橋?(中科院)解析:第一步,小明與弟弟過橋,小明回來,耗時(shí)秒;第二步,小明與爸爸過河,弟弟回來,耗時(shí)秒;第三步,媽媽與爺爺過河,小明回來,耗時(shí)秒;最后,小明與弟弟過河,耗時(shí)秒,總共耗時(shí)秒,多么驚險(xiǎn)!65(北京贊同科技) 現(xiàn)有1100共一百個自然數(shù),已隨機(jī)放入一個有98個元素的數(shù)組a98。要求寫出一個盡量簡單的方案,找出沒有被放入數(shù)組的

56、那2個數(shù),并在屏幕上打印這2個數(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. 簡單說明TCP與UDP的區(qū)別 解析:1。TCP是基于連

57、接的,UDP是基于無連接 2。對系統(tǒng)資源的要求(TCP較多,UDP少) 3。UDP程序結(jié)構(gòu)較簡單 4。流模式與數(shù)據(jù)報(bào)模式 5。TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證67. 鍵字volatile有什么含意?并給出三個不同的例子。解析:一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時(shí)必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子: 1) 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 2) 一個中斷服務(wù)子程序中會訪問到的非

58、自動變量 3) 多線程應(yīng)用中被幾個任務(wù)共享的變量 補(bǔ)充問題:1) 一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。可以。一個例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。2) 一個指針可以是volatile 嗎?解釋為什么??梢浴1M管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時(shí)。68. C和C+有什么不同?解析: 從機(jī)制上:c是面向過程的(但c也可以編寫面向?qū)ο蟮某绦颍?;c+是面向?qū)ο蟮?,提供了類。但是,c+編寫面向?qū)ο蟮某绦虮萩容易 從適用的方向:c適合要求代碼體積小的,效

59、率高的場合,如嵌入式;c+適合更上層的,復(fù)雜的;linux核心大部分是c寫的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。 C語言是結(jié)構(gòu)化編程語言,C+是面向?qū)ο缶幊陶Z言。C+側(cè)重于對象而不是過程,側(cè)重于類的設(shè)計(jì)而不是邏輯的設(shè)計(jì)。69 main 主函數(shù)執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼,給出說明? 解析:可以,可以用_onexit 注冊一個函數(shù),它會在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個硬幣100真、1假,真假區(qū)別在于重量。請用無砝碼天平稱兩次給出真幣重還是假幣重的結(jié)論。解析: 第一步:把硬幣分為三堆兒(50,50,1),先拿兩個50 放天平比較,如果相等,說明單個的就是假的,再隨便拿一個真硬幣和這個假硬幣放天平比較一下就可得到結(jié)果。第二步:如果第一步的兩個50 比較后不相等,此時(shí)一端50重,一端50輕。如果拿輕的一端50,分成兩堆(25,25) 放到天平上,如果這兩個25相等,則假硬幣(重)在重的一端50里,否 則(不相等)假硬幣(輕)在這兩個(25,25

61、)里,也就是輕的一端50里。71. 變量的聲明和定義有什么區(qū)別?解析:2. 一個變量的定義會為變量分配存儲空間,也有可能同時(shí)為其提供初始值;3. 聲明則僅給出變量的數(shù)據(jù)類型和變量名稱;4. 變量的定義肯定也是變量的聲明,反之則未必;5. 在作用域內(nèi),變量的定義有且僅有一個,聲明則可以有多個;6. 有extern的時(shí)候,兩者的情況區(qū)分:72下列代碼:char * GetStr()char *tmp;tmp = "123"return tmp;void main()printf("%s", GetStr();

62、會輸出123嗎?123創(chuàng)建在堆上還是棧上呢?123的空間是什么時(shí)候釋放的? 解析:可以輸出123,首先123是一個字符串常量,存儲在只讀常量區(qū), 在函數(shù)調(diào)用完成之后不會被釋放,他的生命周期是程序開始到程序結(jié)束, 他既不是在堆上也不是在棧上。73 關(guān)鍵字volatile有什么含意 并給出三個不同的例子。 解析:一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣, 編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時(shí)必 須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。 下面是volatile變量的幾個例子: 1). 并行設(shè)備的硬件寄存器(如

63、:狀態(tài)寄存器) 2). 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables) 3). 多線程應(yīng)用中被幾個任務(wù)共享的變量 74 C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 解析:上面的例子是完全合乎語法的。問題是編譯器如何處理它? 水平不高的編譯作者實(shí)際上會爭論這個問題,根據(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)是通過重載一元的”*”和”->”來從容器中間接地返回一個值。將這些值存儲在容器中并不是一個好主意,因?yàn)槊慨?dāng)一個新值添加到容器中或者有一個值從容器中刪除,這些值就會失效。在某種程度上,游標(biāo)可以看作是句柄(handle)。通常情況下游標(biāo)(iterator)的類型可以有所變化,這樣容器也會有幾種不同方式的轉(zhuǎn)變:iterator對于除了vector以外的其他任何容器,你可以通過這種游標(biāo)在一次操作中在容器中朝向前的方向走一步。這意味著對于這種游標(biāo)你只能使用“+”操作符。而不能使用“-”或“+=”操作符。而對于vector這

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論