面試C/C++ 觀念整理

文章推薦指數: 80 %
投票人數:10人

這裡有些題目是來自網路上MTK面試的C考古題,另外又加入了一些易搞混的觀念,幫自己統整一下,也希望能幫助在求職的讀者,面試的過程真的心很累啊! GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWrite面試C/C++觀念整理這裡有些題目是來自網路上MTK面試的C考古題,另外又加入了一些易搞混的觀念,幫自己統整一下,也希望能幫助在求職的讀者,面試的過程真的心很累啊!如果有寫錯的地方再麻煩告知我。

目前這邊已沒有繼續維護,可至我個人blog:https://deeprecurrent.github.io/2021/09/25/210925_cpp_interview/Explain“#error”?預處理指令。

預處理階段只要遇到#error就會生成一個錯誤提示訊息並停止Whatis“const”?andwhatisthemeaningof:constinta;intconsta;constint*a;int*consta;intconst*aconst;const代表只可讀不可改。

1.一個常數型整數2.同1,一個常數型整數3.一個指向常數型整數的指標(整型數不可修改,但指標可以)4.一個指向整數的常數型指標(指標指向的整數可以修改,但指標不可修改)5.一個指向常數型整數的常數型指標(指標指向的整數不可修改,同時指標也不可修改)Explain“struct”and“union”?struct稱為結構體,可以包含數個不同資料型態的變數,所有變數佔用不同的內存。

union稱為聯合體,也可以包涵不同資料型態的變數,但是所有辨識站又相同內存。

Explain“volatile”.Canweuse“const”and“volatile”inthesamevariable?Canweuse“volatile”inapointer?一個定義為volatile的變量是說這變量可能會被意想不到地改變(尤其在嵌入式系統),因此編譯器不會去假設這個變量的值了。

精確地說就是,優化器不會將其優化,而是在用到這個變量時必須每次都重新讀取這個變量的值,不是使用保存在暫存器裡的備份。

下面是volatile變量的幾個例子︰1.並行設備的硬體暫存器(如︰狀態暫存器)2.一個中斷服務子程序中會訪問到的非自動變數(Non-automaticvariables)3.多執行緒中共享的變數是的。

一個例子是只讀的狀態寄存器(不應該被程式修改,但有可能被硬體修改,比如interruptroutine)。

它是volatile因為它可能被意想不到地改變。

它是const因為程序不應該試圖去修改它。

是的。

比如當一個中斷服務的子程序修改一個指向buffer的pointer時。

Whatisthedifferencebetween“InlineFunction”and“Macro”?Macro是在預處理時直接單純的文字替換,inlinefunction是在compile階段時,直接取代function。

比較下面兩個例子:inline寫法:inlineintsquare(intx){returnx*x;}output:SQUARE(3+2)→(3+2)*(3+2)=25Macro寫法:#defineSQUARE(x)(x*x)output:SQUARE(3+2)→3+2*3+2=11Explain“static”?1.static出現在變數前,且該變數宣告於函式中(C/C++):局部變數加上static修飾後便不會因為離開可視範圍而消失。

2.static出現在變數前,且該變數不是宣告於函式中(C/C++):讓變數只限定在該檔案內,而不是整個程式中(解決編譯時連結多個檔案造成相同變數名衝突)。

3.static出現在類別的成員變數前(C++only):表示該變數不屬於某個類別實例,他屬於這個類別,所有以此類別生成出來的實例都共用這個變數。

4.static出現在類別的成員函式之前(C++only):表示該函式不屬於某個類別實例,他屬於這個類別,所有以此類別生成出來的實例都共用這個函式(即便我們沒有產生實例出來,我們也隨時可以取用這個函式)(同python的@staticmethod)。

referenceWhatisstackandheapwhentalkingaboutmemory?Stack:allocatedbycompiler,storefunctionparametersandlocalvariables1.veryfastaccess2.don'thavetoexplicitlyde-allocatevariables3.spaceismanagedefficientlybyCPU,memorywillnotbecomefragmented4.localvariablesonly5.limitonstacksize(OS-dependent)6.variablescannotberesizedHeap:allocatedbyprogrammer1.variablescanbeaccessedglobally2.nolimitonmemorysize3.(relatively)sloweraccess4.noguaranteedefficientuseofspace,memorymaybecomefragmented5.youmustmanagememory(you'reinchargeofallocatingandfreeingvariables)ormemoryleakagewillhappen6.variablescanberesizedusingrealloc()Static:storeglobalvariableandstaticvariable(initializedwhenprocessstarts)LiteralConstant:storecomments(text)Explain“thread”and“process”,andwhatisthedifference?Process:anexecutinginstanceofanprogram.Processtakesmoretimetoterminateanditisisolatedmeansitdoesnotsharememorywithanyotherprocess.Thread:apathofexecutionwithinaprocess.Threadtakeslesstimetoterminateascomparedtoprocessandlikeprocessthreadsdonotisolate.Theysharememorywithotherthreads.-->Thetypicaldifferenceisthatthreads(ofthesameprocess)runinasharedmemoryspace,whileprocessesruninseparatememoryspaces.Readmoredefineavariable“a”fromthefollowingrequests:AnintegerApointertoanintegerApointertoapointertoanintegerAnarrayof10integersAnarrayof10pointerstointegersApointertoanarrayof10integersApointertoafunctionthattakesanintegerasanargumentandreturnsanintegerAnarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnanintegerANS.1.inta2.int*a3.int**a4.inta[10]5.int*a[10]6.int(*a)[10]7.int(*a)(int)8.int(*a[10])(int)Whatisthecontentofarraya?inta[]={6,7,8,9,10};int*p=a;*(p++)+=123;*(++p)+=123;ANS:{129,7,131,9,10}Typedef在C語言中頻繁用以宣告一個已經存在的資料型態的同義字。

也可以用預處理器做類似的事。

例如,思考一下下面的例子︰#definedPSstructs*typedefstructs*tPS;以上兩種情況的意圖都是要定義dPS和tPS作為一個指向結構s指標。

哪種方法更好呢?(如果有的話)為什麼?答案是︰typedef更好。

思考下面的例子︰dPSp1,p2;tPSp3,p4;第一個擴展為structs*p1,p2;上面的程式碼定義p1為一個指向結構的指標,p2為一個實際的結構,這也許不是你想要的,所以沒事不要亂用macro。

Whatisthedifferencebetweenvariabledeclarationanddefinition?Adeclarationprovidesbasicattributesofasymbol:itstypeandname.Adefinitionprovidesallofthedetailsofthatsymbol.Istheprogrambelowcorrect?unsignedintzero=0;unsignedintcompzero=0xFFFF;/*1’scomplementofzero*/對于一個整數型不是16位元的處理器為說,上面的程式碼是不正確的。

應編寫如下︰unsignedintcompzero=~0;Whatistheoutputofthefollowingprogram?voidfoo(void){unsignedinta=6;intb=-20;(a+b>6)?puts(“>6”):puts(“<=6”);}當表達式中存在有符號類型和無符號類型(unsigned)時所有的操作數都自動轉換為無符號類型。

因此-20變成了一個非常大的正整數,所以該表達式計算出的結果大于6。

Thefasterwaytoanintegermultiplyby7?i=(i<<2)+(i<<1)+(i<<0)Reverseastring.voidreverseStr(string&str){intn=str.length();for(inti=0;i='A'&&ch<='Z');}inttoUpper(intch){if(isUpper(ch))returnch;elsereturn(ch+'A'-'a');}Thevalueofvwithintheprogrambelow?unsignedlongv1=0x00001111;unsignedlongv2=0x00001202;unsignedlongv;v=v1&(~v2);————(1)v=v|v2;————(2)記得先轉成2進位再做bitoperationANS.(1)v=0x00000111(2)v=0x00001313Thevalueof*(a+1),(*p-1)withintheprogrambelow?inta[5]={1,2,3,4,5}int*p=(int*)(&a+1);ANS.*(a+1)=2,(*p—1)=一個亂數Writeacodethatsetthespecificbitclearthespecificbitinversethespecificbit(0->1;1->0)1.voidsetBit(int&a,b){a|=(0x1<typedefvoid(*pf)(char*);Writeacodethatchecktheinputisamultipleof3ornotwithoutusingdivisionormod.#includeusingnamespacestd;intmain(){intn;cin>>n;while(n>=3)n-=3;if(!n)cout<usingnamespacestd;intmain(){intx,cout=0;cin>>x;while(x>0){c++;x=x&(x-1);}cout<next++n;if(n%2)middle=middle->next;}returnmiddle;}Writeacodetoreversethelinkedlist.voidreverse_list(ListNode*head){//createthreepointerprecedent,current,andpreviousListNode*curr=head,*prev=NULL,*prec=NULL;while(curr){prec=curr->prec;curr->next=prev;prev=curr;curr=prec;}head=prev;}Findthepossibleerror:intival;int**p;ival=*p;Ans,*pisapointertointandivalisintWhatisthepossibleerrorofbelowSQRfunction:intSQR(volatileint*a){return(*a)*(*a);}由於*a的值可能被意想不到地該變,因此第一個(*a)和第二個(*a)可能是不同的。

結果,這段程式碼可能返回不是你所期望的平方值!正確的程式碼如下︰longsquare(volatileint*a){intb;b=*a;returnb*b;}保證n一定是下面五個數字之一,不能用if和switchcase,請用你認為最快的方法實作mainexternvoidfunc1(void);externvoidfunc2(void);externvoidfunc3(void);externvoidfunc4(void);externvoidfunc5(void);voidmain(intn){ifn==1executefunc1;ifn==2executefunc2;ifn==3executefunc3;ifn==4executefunc4;ifn==5executefunc5;}typedefvoid(*fp)(void);fpfpa[5];fpa[1]=func1;//equivalenttofpa[1]=&func1fpa[2]=func2;fpa[3]=func3;fpa[4]=func4;fpa[5]=func5;voidmain(intn){(*fpa[n])();}--MorefromwenchenFollowwenchenq.github.ioLovepodcastsoraudiobooks?Learnonthegowithournewapp.TryKnowableRecommendedfromMediumROTL-'DarkstormBringers'NFT(熱血江湖)OfficialMintSiteforROTL:DarkstormBringersAnviLewisTop15Front-endDevelopmentToolsToUseIn2021DilpreetSinghinTechShotsWhatViewPager2hastooffer?HyperDAOPresentedbyHyperDAO✨MateomojicaWhatnobodytellsyouaboutHTMLasabeginnerSatishPanwarinHitachiSolutionsBraintrustJobhistorycleanupinDynamics365FinanceandSupplyChainManagementNoLongerSetMarkoftheWeb(MOTW)SupportAmongZipUtilitiesYeoninleiron예외정리AboutHelpTermsPrivacyGettheMediumappGetstartedwenchen8Followerswenchenq.github.ioFollowMorefromMediumCosmicDriftTheLegendofIfstrath,TheBeaconGillianAndrewsWomenandPower — GillianAndrewsAuthorThinkOrSwimparaEspaña(nooficial)📈LosmejoresscriptsparalaplataformadenegociaciónThinkorswim(TOS)PeytonMurneyProject4:(PossiblyLost&)FoundObjectsHelpStatusWritersBlogCareersPrivacyTermsAboutKnowable



請為這篇文章評分?