標準c語言筆試題_第1頁
標準c語言筆試題_第2頁
標準c語言筆試題_第3頁
標準c語言筆試題_第4頁
標準c語言筆試題_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

標準c語言筆試題1.局部變量能否和全局變量重名?(華為)解析:能,局部會屏蔽全局。要用全局變量,需要使用"::"局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在同一個函數內可以定義多個同名的局部變量.比如在兩個循環(huán)體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環(huán)體內。3.如何引用一個已經定義過的全局變量?(華為)解析:extern可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個編寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。4.static全局變量與普通的全局變量有什么區(qū)別?解析:1)全局變量(外部變量)的說明之前再冠以static就構成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當然也是靜態(tài)存儲方式從以上分析可以看出,static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據上一次結果值;static函數與普通函數有什么區(qū)別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝5.進程和線程的差別(微軟亞洲)解析:答:線程是指進程內的一個執(zhí)行單元,也是進程內的可調度實體.與進程的區(qū)別:(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位(2)并發(fā)性:不僅進程之間可以并發(fā)執(zhí)行,同一個進程的多個線程之間也可并發(fā)執(zhí)行(3)擁有資源:進程是擁有資源的獨立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進程的資源.(4)系統(tǒng)開銷:在創(chuàng)建或撤消進程時,由于系統(tǒng)都要為之分配和回收資源,導致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷6.用宏定義寫出swap(x,y)(思科)解析:#defineswap(x,y)x=x+y;y=x-y;x=x-y7.什么是預編譯,何時需要預編譯:(思科)解析:就是指程序執(zhí)行前的一些預處理工作,主要指#表示的.何時需要預編譯?1)、總是使用不經常改動的大型代碼體。2)、程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個預編譯頭。8.下述三個有什么區(qū)別?char*constp;charconst*p,constchar*p;(慧通)解:constchar*p和charconst*p修飾的是p所指向的變量,不可以用*p=’a’等這樣的方式修改變量區(qū)的內容.指針本身是可以修改的,比如說charx,y;const*p=&x,p=&y,修改指針本身是可以的,*p=‘b’就不行。Char*constp;中const修飾的是指針,表明指針在操作過程中不可以修改,而指針所指向的內容是可以修改的,比如說charx,y;char*constp=&x;*p=‘b’是可以的,但p=&y;是不可以的,const修飾的是指針,不可以修改指針的指向,只可以修改指針所捆綁的變量9.int(*s[10])(int)表示的是什么?。浚ɑ弁ǎ┙馕?這樣的表達式可以遵循這樣的規(guī)則:從右向左,由近及遠,括號優(yōu)先;比如:從a符號開始。其右邊是[10],說明a是個數組,其中存了十個元素。再看a的左邊是一個*。說明數組中存的是指針。現在在看(*a[10])的右邊是(int);說明所存的指針是指向有一個int形參的函數現在看(*a[10])的左邊是個int,說明指向的函數的返回值為int類型;10.進程之間通信的途徑,進程間通信方法(慧通)解析:無名管道,命名管道,消息隊列,信號,共享內存,套接字。等11.什么是“引用”?申明和使用“引用”要注意哪些問題?解析:引用就是某個目標變量的“別名”(alias),對應用的操作與對變量直接操作效果完全相同。申明一個引用的時候,切記要對其進行初始化。引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。不能建立數組的引用12.include和include“filename.h”的區(qū)別?解析:<>是從標準庫路徑搜索,“”是從用戶當前工作目錄開始,找不到,在到標準庫開始13.Heap和Stack的區(qū)別?解析:Heap是堆,Stack是棧。棧的空間由操作系統(tǒng)自動分配和回收,而堆上的空間由程序員申請和釋放。棧的空間大小較小,而堆的空間較大。棧的地址空間往低地址方向生長,而堆向高地址方向生長。棧的存取效率更高。程序在編譯期間對變量和函數的內存分配都在棧上,且程序運行過程中對函數調用中參數的內存分配也是在棧上。14.sizeof和strlen之間的區(qū)別?解析:(1)sizeof操作符的結果類型是size_t,它在頭文件中的typedef為unsignedint類型,該類型保證能容納實現所建立的最大對象的字節(jié)大小。(2)sizeof是運算符,strlen是函數(3)sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以’\0’結尾的。(4)數組做sizeof的參數不退化,傳遞給strlen就退化為指針。(5)大部分編譯程序在編譯的時候就把sizeof計算過了是類型或是變量的.長度。(6)strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,而不是類型占用內存的大小。(7)sizeof后如果是類型必須加括號,如果是變量名可以不加括號。(8)當使用了一個結構類型或變量時,sizeof返回實際的大小。(9)數組作為參數傳遞給函數時傳的是指針而不是數組,傳遞的是數組的首地址。(10)計算結構變量的大小就必須討論數組對齊問題。(11)sizeof操作符不能用于函數類型,不完全類型或位字段。15.#defineDOUBLE(x)x+x,i=5*DOUBLE(5);i是多少?解析:i為30。16.unsignedshorthash(unsignedshortkey){return(key>>)%256}解析請問hash(16),hash(256)的值分別是:A.1.16;B.8.32;C.4.16;D.1.3217.booldoubleintfloat.各種類型與0值的比較(概率較大)解析:請寫出BOOLflag與“零值”比較的if語句。if(flag)或者if(!flag)如下寫法均屬不良風格,不得分。if(flag==TRUE)if(flag==1)if(flag==FALSE)if(flag==0)請寫出floatx與“零值”比較的if語句。(4分)標準答案示例:constfloatEPSINON=0.00001;if((x>=-EPSINON)&&(x<=EPSINON)不可將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式如下是錯誤的寫法,不得分。if(x==0.0)if(x!=0.0)請寫出char*p與“零值”比較的if語句。(3分)標準答案:if(p==NULL)或者if(p!=NULL)如下寫法均屬不良風格,不得分。if(p==0)if(p!=0)if(p)if(!)18.結構與聯合有和區(qū)別?解析:1.結構和聯合都是由多個不同的數據類型成員組成,但在任何同一時刻,聯合中只存放了一個被選中的成員(所有成員共用一塊地址空間),而結構的所有成員都存在(不同成員的存放地址不同)。2.對于聯合的不同成員賦值,將會對其它成員重寫,原來成員的值就不存在了,而對于結構的不同成員賦值是互不影響的19.簡述數組與指針的區(qū)別?解析:數組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局數組),要么在棧上被創(chuàng)建。指針可以隨時指向任意類型的內存塊。(1)修改內容上的差別chara[]=“hello”;a[0]=‘X’;char*p=“world”;//注意p指向常量字符串p[0]=‘X’;//編譯器不能發(fā)現該錯誤,運行時錯誤(2)用運算符sizeof可以計算出數組的容量(字節(jié)數)。sizeof(p),p為指針得到的是一個指針變量的字節(jié)數,而不是p所指的內存容量。C++/C語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住它。注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。chara[]="helloworld";char*p=a;cout<<sizeof(a)<<endl;//12字節(jié)cout<<sizeof(p)<<endl;//4字節(jié)計算數組和指針的內存容量voidFunc(chara[100]){cout<<sizeof(a)<<endl;//4字節(jié)不是100字節(jié)}20.如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?解析:#ifdef__cpluspluscout<<"c++";#elsecout<<"c";#endif21.main主函數執(zhí)行完畢后,是否可能會再執(zhí)行一段代碼,給出說明?解析:可以,可以用_onexit注冊一個函數,它會在main之后執(zhí)行intfn1(void),fn2(void),fn3(void),fn4(void);voidmain(void){Stringstr("zhanglin");_onexit(fn1);_onexit(fn2);_onexit(fn3);_onexit(fn4);printf("Thisisexecutedfirst.");}intfn1(){printf("next.");return0;}intfn2(){printf("executed");return0;}intfn3(){printf("is");return0;}intfn4(){printf("This");return0;}22.intid[sizeof(unsignedlong)];這個對嗎?為什么??解析:對,這個sizeof是編譯時運算符,編譯時就確定了可以看成和機器有關的常量。23.如何打印出當前源文件的文件名以及源文件的當前行號?解析:cout<<__FILE__;cout<<__LINE__;__FILE__和__LINE__是系統(tǒng)預定義宏,這種宏并不是在某個文件中定義的而是由編譯器定義的解析:不能,數組作為參數傳遞給函數時,數組名被退化為指針,因此函數中的sizeof(str)實際是在求一個指針的sizeof,答案為4,因此不能計算出數組的長度。24.以下函數能求出數組的長度嗎?voidfun(charstr[]){intlen=sizeof(str)/sizeof(str[0]);}25.輸出的結果是多少,并分析過程?unsignedshortA=10;printf(“%u”,~A);charch=128;printf(“%d”,ch);答:~A=4294967285,首先將A轉化為int類型,即對應的二進制數值為:00000000000000000000000000001010,~A=11111111111111111111111111110101,其實這種情況最高位是1,認為是負數,但是在輸出中指定以無符號數輸出,于是結果為4294967285=4294967295(四字節(jié)表示的最大數)-10.ch=128對應的二進制為:10000000,在輸出中以整數形式輸出,由于最高位是1,于是就是負數,10000000是該負數的補碼,根據求補碼的反步驟計算,先-1,得到01111111,在取反得10000000=128,由于本身是負數,即為-128.26.New與mallocfree的聯系與區(qū)別?解析:都是在堆(heap)上進行動態(tài)的內存操作。用malloc函數需要指定內存分配的字節(jié)數并且不能初始化對象,new會自動調用對象的構造函數。會調用對象的destructor,而free不會調用對象的destructor.27.用變量a給出下面的定義(特別重要)a)一個整型數(Aninteger)b)一個指向整型數的指針(Apointertoaninteger)c)一個指向指針的的指針,它指向的指針是指向一個整型數(Apointertoapointertoaninteger)d)一個有10個整型數的數組(Anarrayof10integers)e)一個有10個指針的數組,該指針是指向一個整型數的(Anarrayof10pointerstointege

溫馨提示

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

評論

0/150

提交評論