freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

東軟c語(yǔ)言方向筆試題搜集(編輯修改稿)

2025-07-04 15:06 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 、“假”,應(yīng)直接使用if(var)、if(!var),表明其為“邏輯”判斷;如果用if判斷一個(gè)數(shù)值型變 量(short、int、long等),應(yīng)該用if(var==0),表明是與0進(jìn)行“數(shù)值”上的比較;而判斷指針則適宜用if(var==NULL), 這是一種很好的編程習(xí)慣。浮點(diǎn)型變量并不精確,所以不可將float變量用“==”或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“=”或“=”形式。如果寫成if (x == ),則判為錯(cuò),得0分。試題2:以下為Windows NT下的32位C++程序,請(qǐng)計(jì)算sizeof的值void Func ( char str[100] ){sizeof( str ) = ?}void *p = malloc( 100 )。sizeof ( p ) = ?解答:sizeof( str ) = 4sizeof ( p ) = 4剖析:Func ( char str[100] )函數(shù)中數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個(gè)指針;在失去其內(nèi)涵的同時(shí),它還失去了其常量特性,可以作自增、自減等操作,可以被修改。數(shù)組名的本質(zhì)如下:(1) 數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組;例如:char str[10]。cout sizeof(str) endl。輸出結(jié)果為10,str指代數(shù)據(jù)結(jié)構(gòu)char[10]。(2) 數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,而且是一個(gè)指針常量,不能作自增、自減等操作,不能被修改;char str[10]。str++。 //編譯出錯(cuò),提示str不是左值(3) 數(shù)組名作為函數(shù)形參時(shí),淪為普通指針。Windows NT 32位平臺(tái)下,指針的長(zhǎng)度(占用內(nèi)存的大?。?字節(jié),故sizeof( str ) 、sizeof ( p ) 都為4。試題3:寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。另外,當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?least = MIN(*p++, b)。解答:define MIN(A,B) ((A) = (B) ? (A) : (B))MIN(*p++, b)會(huì)產(chǎn)生宏的副作用剖析:這個(gè)面試題主要考查面試者對(duì)宏定義的使用,宏定義可以實(shí)現(xiàn)類似于函數(shù)的功能,但是它終歸不是函數(shù),而宏定義中括弧中的“參數(shù)”也不是真的參數(shù),在宏展開(kāi)的時(shí)候?qū)Α皡?shù)”進(jìn)行的是一對(duì)一的替換。程序員對(duì)宏定義的使用要非常小心,特別要注意兩個(gè)問(wèn)題:(1) 謹(jǐn)慎地將宏定義中的“參數(shù)”和整個(gè)宏用用括弧括起來(lái)。所以,嚴(yán)格地講,下述解答:define MIN(A,B) (A) = (B) ? (A) : (B)define MIN(A,B) (A = B ? A : B ) 都應(yīng)判0分;(2) 防止宏的副作用。宏定義define MIN(A,B) ((A) = (B) ? (A) : (B))對(duì)MIN(*p++, b)的作用結(jié)果是:((*p++) = (b) ? (*p++) : (*p++)) 這個(gè)表達(dá)式會(huì)產(chǎn)生副作用,指針p會(huì)作三次++自增操作。除此之外,另一個(gè)應(yīng)該判0分的解答是:define MIN(A,B) ((A) = (B) ? (A) : (B))。這個(gè)解答在宏定義的后面加“?!?,顯示編寫者對(duì)宏的概念模糊不清,只能被無(wú)情地判0分并被面試官淘汰。宏的一些副作用優(yōu)先級(jí)問(wèn)題1) 傳入變量?jī)?yōu)先級(jí)define MULTI(a,b) a * bMULTI(1+2,3) = 1 + 2 * 3 其實(shí)是想要(1 + 2) * 32) 作為值返回時(shí),類似1)define ADD(a,b) (a) + (b)int c = ADD(a,b) * 3。 = (a) + (b) * 3 其實(shí)是想要(a + b) * 3所以,一般的規(guī)則是:宏里面參數(shù)全部用括號(hào)括起來(lái);如果作為值返回,整個(gè)表達(dá)式也用括號(hào)括起來(lái)。所以,上面最好這么寫:define MULTI(a,b) ((a) * (b))define ADD(a,b) ((a) + (b))實(shí)際使用參數(shù)和宏內(nèi)部變量同名define HASH(str,sz,rst) do{unsigned int n = 0。 n = xxx。 rst = n % sz。}while(0)這是一個(gè)hash的宏實(shí)現(xiàn),其中定義了一個(gè)臨時(shí)變量n,根據(jù)str計(jì)算n,然后對(duì)sz求模并把返回值賦給傳進(jìn)來(lái)的rst.這么調(diào)用:int n。HASH(“hello”,7,n)。不會(huì)達(dá)到改變n的效果,因?yàn)閷?shí)際使用參數(shù)n和宏內(nèi)部的變量n同名。宏擴(kuò)展中最后一條語(yǔ)句是:n = n % sz。因?yàn)楹陜?nèi)部n有更小作 用域,實(shí)際賦值的是宏內(nèi)部的那個(gè)臨時(shí)變量n。外面調(diào)用的n不會(huì)有任何改變。這個(gè)副作用有些隱蔽,一般的規(guī)則是:宏內(nèi)部變量使用一種不同風(fēng)格的命名方式。比如:define HASH(str,sz,rst) do{unsigned int __n = 0。 __n = …++,–define MAX(a,b) ((a) (b) ? (a) : (b))int a = 3,b = 2。int c = MAX(a++,b)。執(zhí)行看看,不但a的值不是和想要的一致,返回值c也會(huì)讓你大吃一驚,哈哈。(a = 5,c = 4)在宏內(nèi)部一個(gè)變量”執(zhí)行”多少次,它就自增或自減了多少次。所以一般使用宏最好不要傳入自增自減。如果你一定要在宏里消除這個(gè)副作用,可以這樣:define MAX(a,b) ({int __x = (a), __y = (b)。(__x __y) ? __x : __y。})也就是:保證傳入宏的參數(shù)在內(nèi)部只使用一次。(注意:傳入a++或++a都能得到各自正確的效果)這里的內(nèi)部變量__x,__y是不需要用括號(hào)包起來(lái)的,原因可以自己想想。另外對(duì)宏中括號(hào)的使用補(bǔ)充說(shuō)明兩點(diǎn):因?yàn)楹曛卸x了臨時(shí)變量,所以要用{}括起來(lái);因?yàn)橐祷刂担酝饷孢€要用()括起來(lái)({}不返回值);另外,這里還有一個(gè)問(wèn)題:實(shí)際中a,b不一定是int的,這個(gè)宏中的臨時(shí)變量聲明為int,不通用。改進(jìn):define MAX(a,b,type) ({type __x = (a), __y = (b)。(__x __y) ? __x : __y。})使用:MAX(1,2,int)。 MAX(,double)。是不是感覺(jué)怪怪的,有點(diǎn)c++的感覺(jué)~~ 這樣的使用太復(fù)雜了,而且也會(huì)給代碼的閱讀帶來(lái)難度。我覺(jué)得好的態(tài)度是多了解些宏的可能的副作用,在實(shí)際編碼中遵守第2條規(guī)則,不要往宏中傳入自增自減的東西,就夠了。不要把過(guò)多的復(fù)雜度全扔給宏,”通用”也不能盲目,因?yàn)楫吘梗簓y是沒(méi)有極限的。試題4:為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?Codeifndef __INCvxWorkshdefine __INCvxWorkshifdef __cplusplusextern “C” {endif/**/ifdef __cplusplus}endifendif /* __INCvxWorksh */解答:頭文件中的編譯宏ifndef __INCvxWorkshdefine __INCvxWorkshendif的作用是防止被重復(fù)引用。作為一種面向?qū)ο蟮恼Z(yǔ)言,C++支持函數(shù)重載,而過(guò)程式語(yǔ)言C則不支持。函數(shù)被C++編譯后在symbol庫(kù)中的名字與C語(yǔ)言的不同。例如,假設(shè)某個(gè)函數(shù)的原型為:void foo(int x, int y)。該函數(shù)被C編譯器編譯后在symbol庫(kù)中的名字為_(kāi)foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函數(shù)名和函數(shù)參數(shù)數(shù)量及類型信息,C++就是考這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。為了實(shí)現(xiàn)C和C++的混合編程,C++提供了C連接交換指定符號(hào)extern “C”來(lái)解決名字匹配問(wèn)題,函數(shù)聲明前加上extern “C”后,則編譯器就會(huì)按照C語(yǔ)言的方式將該函數(shù)編譯為_(kāi)foo,這樣C語(yǔ)言中就可以調(diào)用C++的函數(shù)了。試題5:編寫一個(gè)函數(shù),作用是把一個(gè)char組成的字符串循環(huán)右移n個(gè)。比如原來(lái)是“abcdefghi”如果n=2,移位后應(yīng)該是“hiabcdefgh”函數(shù)頭是這樣的://pStr是指向以’\0′結(jié)尾的字符串的指針//steps是要求移動(dòng)的nvoid LoopMove ( char * pStr, int steps ){//請(qǐng)?zhí)畛洹瓆解答:正確解答1:Codevoid LoopMove ( char *pStr, int steps ){int n = strlen( pStr ) – steps。char tmp[MAX_LEN]。strcpy ( tmp, pStr + n )。strcpy ( tmp + steps, pStr)。*( tmp + strlen ( pStr ) ) = ‘\0′。strcpy( pStr, tmp )。}正確解答2:Codevoid LoopMove ( char *pStr, int steps ){int n = strlen( pStr ) – steps。char tmp[MAX_LEN]。memcpy( tmp, pStr + n, steps )。memcpy(pStr + steps, pStr, n )。memcpy(pStr, tmp, steps )。}剖析:這個(gè)試題主要考查面試者對(duì)標(biāo)準(zhǔn)庫(kù)函數(shù)的熟練程度,在需要的時(shí)候引用庫(kù)函數(shù)可以很大程度上簡(jiǎn)化程序編寫的工作量。最頻繁被使用的庫(kù)函數(shù)包括:(1) strcpy(2) memcpy(3) memsetmemcpy原型:extern void *memcpy(void *dest, void *src, unsigned int count)。用法:include功能:由src所指內(nèi)存區(qū)域復(fù)制count個(gè)字節(jié)到dest所指內(nèi)存區(qū)域。說(shuō)明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。注意:與strcpy相比,memcpy并不是遇到’\0′就結(jié)束,而是一定會(huì)拷貝完n個(gè)字節(jié)。舉例:// includeincludeint main(int argc, char* argv[]){char *s=”Golden Global View”。char d[20]。clrscr()。memcpy(d,s,strlen(s))。d[strlen(s)]=’\0′。printf(“%s”,d)。getchar()。return 0。}截取viewincludeint main(int argc, char* argv[]){char *s=”Golden Global View”。char d[20]。memcpy(d,s+14,4)。//memcpy(d,s+14*sizeof(char),4*sizeof(char))。也可d[4]=’\0′。printf(“%s”,d)。getchar()。return 0。}輸出結(jié)果:View初始化數(shù)組char msg[10]。memcpy(msg,0,sizeof(msg))。memset函數(shù)原型void *memset(void *s, int ch, unsigned n)。編輯本段程序例includeincludeincludememset函數(shù)int main(void){char buffer[] = “Hello world\n”。printf(“Buffer before memset: %s\n”, buffer)。memset(buffer, ‘*’, strlen(buffer) )。printf(“Buffer after memset: %s\n”, buffer)。return 0。}輸出結(jié)果:Buffer before memset: Hello worldBuffer after memset: ***********編譯平臺(tái):Microsoft Visual C++ 也不一定就是把內(nèi)容全部設(shè)置為ch指定的ASCII值,而且該處的ch可為int或者其他類型,并不一定要是char類型。例如下面這樣:int array[5] = {1,4,3,5,2}。for(int i = 0。 i 5。 i++)coutarray[i] 。coutendl。memset(array,0,5*sizeof(int))。for(int k = 0。 k 5。 k++)coutarray[k] 。coutendl。輸出的結(jié)果就是:1 4 3 5 20 0 0 0 0后面的表大小的參數(shù)是以字節(jié)為單位,所以,對(duì)于int或其他的就并不是都乘默認(rèn)的1(字符型)了。而且不同的機(jī)器上int的大小也可能不同,所以最好用sizeof()。要注意的是,memset是對(duì)字節(jié)進(jìn)行操作,所以上述程序如果改為int array[5] = {1,4,3,5,2}。for(int i = 0。 i 5。 i++)coutarray[i] 。coutendl。memset(array,1,5*sizeof(int))。// 注意 這里與上面的程序不同
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)教案相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1