C/C++面試題(二)

1、一語句實現x是否爲2的若干次冪的判斷

       1)int i = 512;

       cout << boolalpha << ((i & (i - 1)) ? false : true) << endl; //位與爲0,則表示是2的若干次冪

       2)return  (x>>N==1);

2、請問以下代碼有什麼問題?

char* s="AAA";

printf("%s",s);

s[0]='B';

printf("%s",s);

"AAA"是字符串常量。s是指針,指向這個字符串常量,

又因爲是常量區,所以對於s[0]的賦值操作是不合法的

3、寫一個“標準”宏,這個宏輸入兩個參數並返回較小的一個。

       #define Min(X, Y) ((X)>(Y)?(Y):(X)) //結尾沒有;

4、交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之後a=5,b=3; 0

       有兩種解法, 一種用算術算法, 一種用^(異或)

a = a + b;

b = a - b;

a = a - b;

       或者

a = a^b;// 只能對int,char..

b = a^b;

a = a^b;

5、下面程序有問題嗎?

#include <stdio.h>

#include <stdlib.h>

void getmemory(char *p){

       p=(char *) malloc(100);

}

int main( ){

       char *str=NULL;

            getmemory(str);

       strcpy(p,"hello world");

       printf("%s/n",str);

       free(str);

       return 0;

}

6、進程之間通信的途徑

共享存儲系統

消息傳遞系統

管道:以文件系統爲基礎

7、下面這個程序執行後會有什麼錯誤或者效果。

#define MAX 255

int main(){

              unsigned char A[MAX],i;

              for (i=0;i<=MAX;i++)

              A[i] = i;

}

       MAX=255,數組A的下標範圍爲:0…MAX-1,這是其一,其二i循環到255時,又循環內執行。

       因爲A[255]=255;這句本身沒有問題,但是返回for (i=0;i<=MAX;i++)語句時,由於unsigned char的取值範圍在(0~255)i++以後i又爲0了,無限循環下去。

8ASSERT()是幹什麼用的

ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式爲FALSE (0),

程序將報告錯誤,並終止執行。如果表達式不爲0,則繼續執行後面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重後果,同時也便於查找錯誤。例如,變量n在程序中不應該爲0,如果爲0可能導致錯誤,你可以這樣寫程序:

......

ASSERT( n != 0);

k = 10/ n;

......

ASSERT只有在Debug版本中才有效,如果編譯爲Release版本則被忽略。assert()的功能類似,它是ANSI C標準中規定的函數,它與ASSERT的一個重要區別是可以用在Release版本中。

9system"pause");作用?

系統的暫停程序,按任意鍵繼續,屏幕會打印“按任意鍵繼續……”

10、請講一講析構函數和虛函數的用法和作用?

析構函數也是特殊的類成員函數,它沒有返回類型,沒有參數,不能隨意調用,也沒有重載。只是在類對象生命期結束的時候,由系統自動調用釋放在構造函數中分配的資源。這種在運行時,能依據其類型確認調用那個函數的能力稱爲多態性,或稱遲後聯編。另:析構函數一般在對象撤消前做收尾工作,比如回收內存等工作。

虛擬函數的功能是使子類可以用同名的函數對父類函數進行覆蓋,並且在調用時自動調用子類覆蓋函數,如果是純虛函數,則純粹是爲了在子類覆蓋時有個統一的命名而已。

注意:子類重新定義父類的虛函數的做法叫覆蓋,override,而不是overload(重載),重載的概念不屬於面向對象編程,重載指的是存在多個同名函數,這些函數的參數表不同..重載是在編譯期間就決定了的,是靜態的,因此,重載與多態無關.與面向對象編程無關.

11、爲什麼標準頭文件都有類似以下的結構?
       #ifndef __INCvxWorksh
       #define __INCvxWorksh
              ……
       #endif

       防止被重複引用。

12編寫一個標準strcpy函數,原型爲

char* strcpy( char *strDest, const char *strSrc )

       char*  strcpy( char *strDest, const char *strSrc ){

              assert( (strDest != NULL) && (strSrc != NULL) );

              char *address = strDest;

              while( (*strDest++ = * strSrc++) != ‘\0’ );

           return address;

       }

http://blog.csdn.net/littlestream9527/article/details/8257630

 

13、分別給出BOOLintfloat,指針變量與“零值”比較的 if 語句(假設變量名爲var)並能清晰表達程序的意思。

http://www.cnblogs.com/zhangdongsheng/archive/2010/11/08/1871405.html

BOOL型變量:if(!var)

int型變量: if(var==0)

float型變量:

              const float EPSINON = 0.00001;

              if ((x >= - EPSINON) && (x <= EPSINON)

指針變量:  if(var==NULL)

浮點型變量並不精確,所以不可將float變量用“==”=”與數字比較,應該設法轉化成“>=”“<=”形式。

14、以下程序的輸出結果?

int main()

{

              char a[7]= “ab\0cde\0”;

              int i,j;

              i=sizeof(a);

              j=strlen(a);

              printf(“ddn”i,j);

     }

           c語言中以‘\0’作爲字符串的結束符,且strlen()函數計算的是‘\0’字符前的所有字符的個數。數組定義以後系統就爲其分配相應大小的內存空間,而不論其中有沒有內容。

15、以下程序的輸出結果?     

       int main()

    {

              int  a[3][3]*pi

              p=&a[0][0]

              for(i=0i<9i++)

              p[i]=i+2

              printf(”dn”a[2][1])

       }

輸出結果:9

16、寫一個函數返回1+2+3+…+n的值(要求代碼儘量簡單、高效)

       int Sum( int n ){

              long sum = 0;

              for( int i=1; i<=n; i++ ){

                     sum += i;}

              return sum;

       }

       int Sum( int n ){

              return ( (long)1 + n) * n / 2;  //return (1l + n) * n / 2;

       }

       所以程序員們需要敏感地將數學等知識用在程序設計中。

17、請寫一個C函數:若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1

       int checkCPU(){

              union w{

                     int a;

                     char b;

              } c;

              c.a = 1;

              return (c.b == 1);

       }

http://blog.csdn.net/rtyytr/article/details/6703580

 

18、看看下面的一段程序有什麼錯誤?
如何修正?

       swap( int* p1,int* p2 )

       {

              int *p;

              *p = *p1;

              *p1 = *p2;

              *p2 = *p;

       }

       swap函數中,p是一個“野”指針,有可能指向系統區,導致程序運行的崩潰。

19、分析下面一段程序有什麼錯誤?如何修正?

       int main(int argc, char* argv[])

       {

              char *string = NULL;

              char strdes[10];

              char str[10];

              int i;

              for(i=0; i<10; i++){

                     str[i] = 'a';

              }

              string = strcpy(strdes, str);

              printf("%s\n",string);

              return 0;

       }

20、函數編寫

       編寫一個函數,作用是把一個char組成的字符串循環右移n

      。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefg”。提示:使用庫函數: strcpy()或者memcpy()

        

21、嵌入式系統中經常要用到無限循環,你怎麼樣用C編寫死循環呢?

       while(1)

       {}

       ----------------------------------------------------------

       for(;;)

       {}

      --------------------------------------

       goto

       Loop:

       ...

       goto Loop;

22、#i nclude<filename.h> i nclude “filename.h” 有什麼區別?

前者用來包含開發環境提供的庫頭文件,後者用來包含

自己編寫的頭文件。

23、在C++ 程序中調用被 C 編譯器編譯後的函數,爲什麼要加 extern “C”聲明?

      

       函數和變量被C++編譯後在符號庫中的名字與C語言的不同,被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的。由於編譯後的名字不同,C++程序不能直接調

       C 函數。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。

24、函數模板與類模板有什麼區別?

       函數模板的實例化是由編譯程序在處理函數調用時自動完成的,而類模板的實例化必須由程序員在程序中顯式地指定。

25、編譯器自動對齊的原因?

       爲了提高程序的性能,數據結構(尤其是棧)應該儘可能地在自然邊界上對齊。原因在於,爲了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。

26、引用與指針有什麼區別?

       1) 引用必須被初始化,指針不必。

       2) 引用初始化以後不能被改變,指針可以改變所指的對象。

       3) 不存在指向空值的引用,但是存在指向空值的指針。

http://zhidao.baidu.com/question/4616759.html?qbl=relate_question_0&word

27、一個32位的機器,該機器的指針是多少位。

       指針是多少位只要看地址總線的位數就行了。80386以後的機子都是32的數據總線(馮.諾依曼結構,地址總線和數據總線複用)。所以指針的位數就是4個字節了。

28、設n=10,i=4,則賦值運算
   n%=i+1
執行後n的值爲(   
   A
0        B.1         C.2       D.3

29、設a,b爲整型數,且a=2,b=4,則表達式(a/b?b+a:b-a)的值爲:

       A . 0.5    B. 6    C. 2   D. 此表達式錯誤

30、在中國東北有這樣兩個村落,趙村所有的村民都是白天祭祀祖先,而李莊的人都是晚上祭祀祖先,能肯定的沒人在白天和晚上都祭祀祖先的。我們也知道趙李明是晚上祭祀祖先的人,那麼以下哪個選項是正確的。

      

       A.趙李明是趙村的人。

       B.趙李明不是趙村的人。

       C.趙李明是李莊的人。

       D.趙李明不是李莊的人。

       E.趙李明既不是趙村的人,也不是李莊的人

31、相傳在古時候某國的國民都分別居住在兩個怪城裏,一座“真城”,一座“假城”。凡真城的人個個都說真話,而假城的人個個都說假話。一位知道情況的外國遊客來到其中一個城市,他只問了一個問題就知道自己來到是哪個城了。猜猜他問了什麼問題?

       你是這個城市的人嗎?

32、設“並非無奸不商”爲真,則下面哪個選項一定爲真。

       A.所有商人都是奸商。

       B.所有商人都不是奸商。

       C.並非所有商人不是奸商。

       D.並非所有商人是奸商。

       E.有的商人不是奸商。

33、有一家人決定搬進城裏,於是去找房子。全家三口,夫妻兩個和一個5歲的孩子。通過廣告找到一家滿意的,於是就前去敲門詢問。但房東遺憾地說:“我們公寓不招有孩子的住戶。丈夫和妻子聽了,一時不知如何是好,於是,他們默默地走開了。
   
5歲的孩子,把事情的經過從頭至尾都看在眼裏,又去敲房東的大門……房東聽了之後,高聲笑了起來,決定把房子租給他們住。

:這位5歲的小孩子說了什麼話,終於說服了房東?

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章