常見c筆試題整理含答案.doc_第1頁
常見c筆試題整理含答案.doc_第2頁
常見c筆試題整理含答案.doc_第3頁
常見c筆試題整理含答案.doc_第4頁
常見c筆試題整理含答案.doc_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

常見c+筆試題整理(含答案)1.是不是一個父類寫了一個virtual 函數,如果子類覆蓋它的函數不加virtual ,也能實現(xiàn)多態(tài)?virtual修飾符會被隱形繼承的。private 也被集成,只事派生類沒有訪問權限而已。virtual可加可不加。子類的空間里有父類的所有變量(static除外)。同一個函數只存在一個實體(inline除外)。子類覆蓋它的函數不加virtual ,也能實現(xiàn)多態(tài)。在子類的空間里,有父類的私有變量。私有變量不能直接訪問。-2.輸入一個字符串,將其逆序后輸出。(使用C+,不建議用偽碼)#include using namespace std;void main()char a50;memset(a,0,sizeof(a);int i=0,j;char t;ne(a,50,n);for(i=0,j=strlen(a)-1;istrlen(a)/2;i+,j-) t=ai; ai=aj; aj=t;coutastr;ce;couta /= (k+m)*1*(k+m);=a = a/9;=a = 1;-5.const 符號常量;(1)const char *p(2)char const *p(3)char * const p說明上面三種描述的區(qū)別;如果const位于星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位于星號的右側,const就是修飾指針本身,即指針本身是常量。(1)const char *p一個指向char類型的const對象指針,p不是常量,我們可以修改p的值,使其指向不同的char,但是不能改變它指向非char對象,如:const char *p;char c1=a;char c2=b;p=&c1;/okp=&c2;/ok*p=c1;/error(3)char * const p此時*p可以修改,而p不能修改。(4)const char * const p這種是地址及指向對象都不能修改。-6.下面是C語言中兩種if語句判斷方式。請問哪種寫法更好?為什么?int n;if (n = 10) / 第一種判斷方式if (10 = n) / 第二種判斷方式如果少了個=號,編譯時就會報錯,減少了出錯的可能行,可以檢測出是否少了=-7.下面的代碼有什么問題?void DoSomeThing(.)char* p;.p = malloc(1024); / 分配1K的空間if (NULL = p)return;.p = realloc(p, 2048); / 空間不夠,重新分配到2Kif (NULL = p)return;.A:p = malloc(1024); 應該寫成: p = (char *) malloc(1024); 沒有釋放p的空間,造成內存泄漏。-8.下面的代碼有什么問題?并請給出正確的寫法。void DoSomeThing(char* p)char str16;int n;assert(NULL != p);sscanf(p, %s%d, str, n);if (0 = strcmp(str, something).A:sscanf(p, %s%d, str, n); 這句該寫成: sscanf(p, %s%d, str, &n);-9.下面代碼有什么錯誤?Void test1() char string10; char *str1=;strcpy(string, str1); 數組越界-10.下面代碼有什么問題?Void test2() char string10, str110; for(i=0; i10;i+) str1i =a; strcpy(string, str1); 數組越界-11.下面代碼有什么問題?Void test3(char* str1) char string10; if(strlen(str1)=10) strcpy(string, str1); =數組越界=strcpy拷貝的結束標志是查找字符串中的0 因此如果字符串中沒有遇到0的話 會一直復制,直到遇到0,上面的123都因此產生越界的情況建議使用 strncpy 和 memcpy-12.下面代碼有什么問題?#define MAX_SRM 256 DSN get_SRM_no() static int SRM_no; /是不是這里沒賦初值?int I; for(I=0;I=MAX_SRM) return (NULL_SRM); else return SRM_no; 系統(tǒng)會初始化static int變量為0,但該值會一直保存,所謂的不可重入.-13.寫出運行結果:/ test1 char str = world; cout sizeof(str) : ; char *p = str; cout sizeof(p) : ; char i = 10; cout sizeof(i) : ; void *pp = malloc(10); cout sizeof(p) endl;6:4:1:4-14.寫出運行結果:/ test2 union V struct X unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; x;unsigned char c; v; v.c = 100; printf(%d, v.x.s3); 3-15.用C+寫個程序,如何判斷一個操作系統(tǒng)是16位還是32位的?不能用sizeof()函數A1:16位的系統(tǒng)下,int i = 65536;cout i; / 輸出0;int i = 65535;cout i; / 輸出-1;32位的系統(tǒng)下,int i = 65536;cout i; / 輸出65536;int i = 65535;cout 65536 ) cout32 bitendl;else cout16 bitendl;-16.C和C+有什么不同?從機制上:c是面向過程的(但c也可以編寫面向對象的程序);c+是面向對象的,提供了類。但是,c+編寫面向對象的程序比c容易從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c+適合更上層的,復雜的; llinux核心大部分是c寫的,因為它是系統(tǒng)軟件,效率要求極高。從名稱上也可以看出,c+比c多了+,說明c+是c的超集;那為什么不叫c+而叫c+呢,是因為c+比c來說擴充的東西太多了,所以就在c后面放上兩個+;于是就成了c+C語言是結構化編程語言,C+是面向對象編程語言。C+側重于對象而不是過程,側重于類的設計而不是邏輯的設計。-17.在不用第三方參數的情況下,交換兩個參數的值#include void main() int i=60; int j=50; i=i+j; j=i-j; i=i-j; printf(i=%dn,i); printf(j=%dn,j);方法二:i=j;j=i;i=j;方法三:/ 用加減實現(xiàn),而且不會溢出a = a+b-(b=a)-18.有關位域的面試題(為什么輸出的是一個奇怪的字符)a.t = b;效果相當于 a.t= b & 0xf;b - b & 0xf -所以輸出Ascii碼為2的特殊字符char t:4;就是4bit的字符變量,同樣unsigned short i:8;就是8bit的無符號短整形變量-19.int i=10, j=10, k=3; k*=i+j; k最后的值是?60-20.進程間通信的方式有?進程間通信的方式有 共享內存, 管道 ,Socket ,消息隊列 , DDE等-21.struct A char t:4; char k:4; unsigned short i:8; unsigned long m; sizeof(A)=?(不考慮邊界對齊)7struct CELL / Declare CELL bit field unsigned character : 8; / ? unsigned foreground : 3; / 00000? unsigned intensity : 1; / 0000?000 unsigned background : 3; / 0?0000 unsigned blink : 1; / ? screen2580; / Array of bit fields二、位結構 位結構是一種特殊的結構, 在需按位訪問一個字節(jié)或字的多個位時, 位結構 比按位運算符更加方便。 位結構定義的一般形式為: struct位結構名 數據類型 變量名: 整型常數; 數據類型 變量名: 整型常數; 位結構變量; 其中: 數據類型必須是int(unsigned或signed)。 整型常數必須是非負的整 數, 范圍是015, 表示二進制位的個數, 即表示有多少位。 變量名是選擇項, 可以不命名, 這樣規(guī)定是為了排列需要。 例如: 下面定義了一個位結構。 struct unsigned incon: 8; /*incon占用低字節(jié)的07共8位*/ unsigned txcolor: 4;/*txcolor占用高字節(jié)的03位共4位*/ unsigned bgcolor: 3;/*bgcolor占用高字節(jié)的46位共3位*/ unsigned blink: 1; /*blink占用高字節(jié)的第7位*/ ch; 位結構成員的訪問與結構成員的訪問相同。 例如: 訪問上例位結構中的bgcolor成員可寫成: ch.bgcolor 注意: 1. 位結構中的成員可以定義為unsigned, 也可定義為signed, 但當成員長 度為1時, 會被認為是unsigned類型。因為單個位不可能具有符號。 2. 位結構中的成員不能使用數組和指針, 但位結構變量可以是數組和指針, 如果是指針, 其成員訪問方式同結構指針。 3. 位結構總長度(位數), 是各個位成員定義的位數之和, 可以超過兩個字 節(jié)。 4. 位結構成員可以與其它結構成員一起使用。 例如: struct info char name8; int age; struct addr address; float pay; unsigned state: 1; unsigned pay: 1; workers; 上例的結構定義了關于一個工人的信息。其中有兩個位結構成員, 每個位結 構成員只有一位, 因此只占一個字節(jié)但保存了兩個信息, 該字節(jié)中第一位表示工 人的狀態(tài), 第二位表示工資是否已發(fā)放。由此可見使用位結構可以節(jié)省存貯空間。-22.下面的函數實現(xiàn)在一個固定的數上加上一個數,有什么錯誤,改正 int add_n(int n) static int i=100; i+=n; return i; 答:因為static使得i的值會保留上次的值。去掉static就可了-23.下面的代碼有什么問題?class A public: A() p=this; A() if(p!=NULL) delete p; p=NULL; A* p; ;答:會引起無限遞歸-24.union a int a_int1;double a_double;int a_int2;typedef structa a1;char y; b;class cdouble c_double;b b1;a a2;輸出coutsizeof(c)j+) & (i+ = j) i+=j;答:i = 5-26.unsigned short array=1,2,3,4,5,6,7;int i = 3;*(array + i) = ?答:4-27.class Avirtual void func1();void func2();Class B: class Avoid func1()cout fun1 in class B endl;virtual void func2()cout fun2 in class B endl; A, A中的func1和B中的func2都是虛函數.B, A中的func1和B中的func2都不是虛函數.C, A中的func2是虛函數.,B中的func1不是虛函數.D, A中的func2不是虛函數,B中的func1是虛函數.答:A-28.數據庫:抽出部門,平均工資,要求按部門的字符串順序排序,不能含有human resource部門,employee結構如下:employee_id, employee_name, depart_id,depart_name,wage答:select depart_name, avg(wage)from employeewhere depart_name human resourcegroup by depart_nameorder by depart_name-29.給定如下SQL數據庫:Test(num INT(4) 請用一條SQL語句返回num的最小值,但不許使用統(tǒng)計功能,如MIN,MAX等答:select top 1 numfrom Testorder by num desc-30.輸出下面程序結果。#include class A public:virtual void print(void) coutA:print()endl; ;class B:public A public:virtual void print(void) coutB:print()endl; ; class C:public Bpublic:virtual void print(void) coutC:print()print(); pb-print(); pc-print(); print(a); print(b); print(c); A:A:print()B:print()C:print()A:print()B:print()C:print()A:print()A:print()A:print()-31.試編寫函數判斷計算機的字節(jié)存儲順序是開序(little endian)還是降序(bigendian)答:bool IsBigendian()unsigned short usData = 0x1122;unsigned char *pucData = (unsigned char*)&usData;return (*pucData = 0x22);-32.簡述Critical Section和Mutex的不同點答:對幾種同步對象的總結1.Critical SectionA.速度快B.不能用于不同進程C.不能進行資源統(tǒng)計(每次只可以有一個線程對共享資源進行存取)2.MutexA.速度慢B.可用于不同進程C.不能進行資源統(tǒng)計3.SemaphoreA.速度慢B.可用于不同進程C.可進行資源統(tǒng)計(可以讓一個或超過一個線程對共享資源進行存取)4.EventA.速度慢B.可用于不同進程C.可進行資源統(tǒng)計-33.一個數據庫中有兩個表:一張表為Customer,含字段ID,Name;一張表為Order,含字段ID,CustomerID(連向Customer中ID的外鍵),Revenue;寫出求每個Customer的Revenue總和的SQL語句。建表create table customer(ID int primary key,Name char(10)gocreate table order(ID int primary key,CustomerID int foreign key references customer(id) , Revenue float)go-查詢select , sum( isnull(Order.Revenue,0) )from customer full join order on( order.customerid= )group by -34.請指出下列程序中的錯誤并且修改void GetMemory(char *p)p=(char *)malloc(100);void Test(void)char *str=NULL;GetMemory=(str);strcpy(str,hello world);printf(str);A:錯誤-參數的值改變后,不會傳回GetMemory并不能傳遞動態(tài)內存,Test函數中的 str一直都是 NULL。strcpy(str, hello world);將使程序崩潰。修改如下:char *GetMemory()char *p=(char *)malloc(100);return p;void Test(void)char *str=NULL;str=GetMemory()strcpy(str,hello world);printf(str);方法二:void GetMemory2(char *p)變?yōu)槎壷羔?void GetMemory2(char *p, int num)*p = (char *)malloc(sizeof(char) * num);-35.程序改錯class mmlprivate: static unsigned int x;public: mml() x+; mml(static unsigned int &) x+; mmlx-;pulic: virtual mon() = 0; static unsigned int mmc()return x; . ;class nnl:public mmlprivate: static unsigned int y;public: nnl() x+; nnl(static unsigned int &) x+; nnlx-;public: virtual mon() ; static unsigned int nnc()return y; . ;代碼片斷:mml* pp = new nnl;.delete pp;A:基類的析構函數應該為虛函數virtual mmlx-;-36.101個硬幣100真、1假,真假區(qū)別在于重量。請用無砝碼天平稱兩次給出真幣重還是假幣重的結論。答:101個先取出2堆,33,33第一次稱,如果不相等,說明有一堆重或輕那么把重的那堆拿下來,再放另外35個中的33如果相等,說明假的重,如果不相等,新放上去的還是重的話,說明假的輕(不可能新放上去的輕)第一次稱,如果相等的話,這66個肯定都是真的,從這66個中取出35個來,與剩下的沒稱過的35個比下面就不用說了方法二:第3題也可以拿A(50),B(50)比一下,一樣的話拿剩下的一個和真的比一下。如果不一樣,就拿其中的一堆。比如A(50)再分成兩堆25比一下,一樣的話就在B(50)中,不一樣就在A(50)中,結合第一次的結果就知道了。-37.static變量和static 函數各有什么特點?答:static變量:在程序運行期內一直有效,如果定義在函數外,則在編譯單元內可見,如果在函數內,在在定義的block內可見;static函數:在編譯單元內可見;-38.用C 寫一個輸入的整數,倒著輸出整數的函數,要求用遞歸方法 ;答:void fun( int a )printf( %d, a%10 );a /= 10;if( a =0 )return;fun( a );-39.寫出程序結果:void Func(char str100)printf(%dn, sizeof(str);答:4分析:指針長度-40.int idsizeof(unsigned long); 這個對嗎?為什么?答:對這個 sizeof是編譯時運算符,編譯時就確定了可以看成和機器有關的常量。求下面函數的返回值( 微軟) int func(x) int countx = 0; while(x) countx +; x = x&(x-1); return countx; 假定x = 9999。 答案:8 思路:將x轉化為2進制,看含有的1的個數。 2. 什么是“引用”?申明和使用“引用”要注意哪些問題? 答:引用就是某個目標變量的“別名”(alias),對應用的操作與對變量直接操作效果完全相同。申明一個引用的時候,切記要對其進行初始化。引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。不能建立數組的引用。 3. 將“引用”作為函數參數有哪些特點? (1)傳遞引用給函數與傳遞指針的效果是一樣的。這時,被調函數的形參就成為原來主調函數中的實參變量或對象的一個別名來使用,所以在被調函數中對形參變量的操作就是對其相應的目標對象(在主調函數中)的操作。 (2)使用引用傳遞函數的參數,在內存中并沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數的參數,當發(fā)生函數調用時,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率和所占空間都好。 (3)使用指針作為函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配存儲單元,且需要重復使用*指針變量名的形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參。而引用更容易使用,更清晰。 4. 在什么時候需要使用“常引用”? 如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。常引用聲明方式:const 類型標識符 &引用名=目標變量名; 例1 int a ; const int &ra=a; ra=1; /錯誤 a=1; /正確 例2 string foo( ); void bar(string & s); 那么下面的表達式將是非法的: bar(foo( ); bar(hello world); 原因在于foo( )和hello world串都會產生一個臨時對象,而在C+中,這些臨時對象都是const類型的。因此上面的表達式就是試圖將一個const類型的對象轉換為非const類型,這是非法的。 引用型參數應該在能被定義為const的情況下,盡量定義為const 。 5. 將“引用”作為函數返回值類型的格式、好處和需要遵守的規(guī)則? 格式:類型標識符 &函數名(形參列表及類型說明) /函數體 好處:在內存中不產生被返回值的副本;(注意:正是因為這點原因,所以返回一個局部變量的引用是不可取的。因為隨著該局部變量生存期的結束,相應的引用也會失效,產生runtime error! 注意事項: (1)不能返回局部變量的引用。這條可以參照Effective C+1的Item 31。主要原因是局部變量會在函數返回后被銷毀,因此被返回的引用就成為了無所指的引用,程序會進入未知狀態(tài)。 (2)不能返回函數內部new分配的內存的引用。 這條可以參照Effective C+1的Item 31。雖然不存在局部變量的被動銷毀問題,可對于這種情況(返回函數內部new分配內存的引用),又面臨其它尷尬局面。例如,被函數返回的引用只是作為一 個臨時變量出現(xiàn),而沒有被賦予一個實際的變量,那么這個引用所指向的空間(由new分配)就無法釋放,造成memory leak。 (3)可以返回類成員的引用,但最好是const。 這條原則可以參照Effective C+1的Item 30。主要原因是當對象的屬性是與某種業(yè)務規(guī)則(business rule)相關聯(lián)的時候,其賦值常常與某些其它屬性或者對象的狀態(tài)有關,因此有必要將賦值操作封裝在一個業(yè)務規(guī)則當中。如果其它對象可以獲得該屬性的非常 量引用(或指針),那么對該屬性的單純賦值就會破壞業(yè)務規(guī)則的完整性。 (4)流操作符重載返回值申明為“引用”的作用: 流操作符,這兩個操作符常常希望被連續(xù)使用,例如:cout hello endl;因此這兩個操作符的返回值應該是一個仍然支持這兩個操作符的流引用??蛇x的其它方案包括:返回一個流對象和返回一個流對象指針。但是對于返回一個流對象,程序必須重新(拷貝)構造一個新的流對象,也就是說,連續(xù)的兩個操作符實際上是針對不同對象的!這無法讓人接受。對于返回一個流指針則不能連續(xù)使用操作符。 因此,返回一個流對象引用是惟一選擇。這個唯一選擇很關鍵,它說明了引用的重要性以及無可替代性,也許這就是C+語言中引入引用這個概念的原因吧。 賦值操作符=。這個操作符象流操作符一樣,是可以連續(xù)使用的,例如:x = j = 10;或者(x=10)=100;賦值操作符的返回值必須是一個左值,以便可以被繼續(xù)賦值。因此引用成了這個操作符的惟一返回值選擇。 例3 i nclude int &put(int n); int vals10; int error=-1; void main() put(0)=10; /以put(0)函數值作為左值,等價于vals0=10; put(9)=20; /以put(9)函數值作為左值,等價于vals9=20; coutvals0; cout=0 & n =9 ) return valsn; else coutsubscript error; return error; (5)在另外的一些操作符中,卻千萬不能返回引用:+-*/ 四則運算符。它們不能返回引用,Effective C+1的Item23詳細的討論了這個問題。主要原因是這四個操作符沒有side effect,因此,它們必須構造一個對象作為返回值,可選的方案包括:返回一個對象、返回一個局部變量的引用,返回一個new分配的對象的引用、返回一 個靜態(tài)對象引用。根據前面提到的引用作為返回值的三個規(guī)則,第2、3兩個方案都被否決了。靜態(tài)對象的引用又因為(a+b) = (c+d)會永遠為true而導致錯誤。所以可選的只剩下返回一個對象了。 6. “引用”與多態(tài)的關系? 引用是除指針外另一個可以產生多態(tài)效果的手段。這意味著,一個基類的引用可以指向它的派生類實例。 例4 Class A; Class B : Class A.; B b; A& ref = b; 7. “引用”與指針的區(qū)別是什么? 指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。此外,就是上面提到的對函數傳ref和pointer的區(qū)別。 8. 什么時候需要“引用”? 流操作符、賦值操作符=的返回值、拷貝構造函數的參數、賦值操作符=的參數、其它情況都推薦使用引用。 以上 2-8 參考: 9. 結構與聯(lián)合有和區(qū)別? 1. 結構和聯(lián)合都是由多個不同的數據類型成員組成, 但在任何同一時刻, 聯(lián)合中只存放了一個被選中的成員(所有成員共用一塊地址空間), 而結構的所有成員都存在(不同成員的存放地址不同)。 2. 對于聯(lián)合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結構的不同成員賦值是互不影響的。 10. 下面關于“聯(lián)合”的題目的輸出? a) i nclude union int i; char x2; a; void main() a.x0 = 10; a.x1 = 1; printf(%d,a.i); 答案:266 (低位低地址,高位高地址,內存占用情況是Ox010A) b) main() union /*定義一個聯(lián)合*/ int i;

溫馨提示

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

評論

0/150

提交評論