1. 程式人生 > >有點意思的C/C++問題及解答:1-5

有點意思的C/C++問題及解答:1-5

問題1 :寫一個交換兩個數的巨集

方法1:可以用異或運算來做,如果是浮點數,這個方法就不行了

[cpp]  view plain copy print ?
  1. #define _swap(a,b) { a=a^b; b=a^b;a=a^b; }  

方法2:用加減法來做,可能會溢位

[cpp]  view plain
copy print ?
  1. #define _swap(a,b) { a=a+b;b=a-b;a=a-b; }  

下面兩種其實已經算是函數了。

方法3:用記憶體複製函式來做

[cpp]  view plain copy print ?
  1. #define _swap(a,b) \
      
  2. {\  
  3.     char tempBuf[8]; \  
  4.     memcpy(tempBuf,&a,sizeof(a)); \  
  5.     memcpy(&a,&b,sizeof(b)); \  
  6.     memcpy(&b,tempBuf,sizeof
    (b)); \  
  7. }  

當然也可以用動態記憶體分配

[cpp]  view plain copy print ?
  1. #define _swap(a, b)\  
  2. {\  
  3.     int size = sizeof(a);\  
  4.     char* temp = (char*)malloc(size);\  
  5.     memcpy(temp, &a, size);\  
  6.     memcpy(&a, &b, size);\  
  7.     memcpy(&b, temp, size);\  
  8.     free(temp);\  
  9. }  

問題2:定義和實現一個類的成員函式為回撥函式

回撥函式的運用的主要技術是函式指標。即將函式指標作為函式的引數之一,然後在這個函式內部通過函式指標,呼叫函式指標所指的函式。

在C++中,類的成員函式隱含了this指標,直接傳遞則引數不匹配。如果非要將類的成員函式作為回撥函式,則可以將該函式宣告為靜態的。例如這樣定義:

[cpp]  view plain copy print ?
  1. class Test  
  2. {  
  3. public:  
  4.     static void callBackFun(void){};  //因為callBackFun預設有一個const Test* 的指標  
  5. };  
  6.   
  7. typedef void (*FPtr)(void);  
  8. void Fun(FPtr ptr)  
  9. {  
  10.     ptr();  
  11. }  
  12. void main(void)  
  13. {  
  14.     Fun(Test::callBackFun);   
  15. }  

問題3:請填寫BOOL , float, 指標變數與“零值”比較的 if 語句

與BOOL比較,標準 if( flag) 或 if( ! flag)

與float比較,標準  const float EPSINON = 0.000001;

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

與指標比較,標準 if(p == NULL) 或 if (p != NULL)

問題4:以下兩條輸出語句分別輸出什麼

[cpp]  view plain copy print ?
  1. float a = 1.0f;   
  2. cout << (int)a << endl;   
  3. cout << (int&)a << endl;   
  4. cout << boolalpha << ( (int)a == (int&)a ) << endl; // 輸出什麼?   
  5. float b = 0.0f;   
  6. cout << (int)b << endl;   
  7. cout << (int&)b << endl;   
  8. cout << boolalpha << ( (int)b == (int&)b ) << endl; // 輸出什麼?   

輸出分別為 false 和 true 。(int)a是進行型別轉換,相當於重新構造了一個值等於a的整數。而(int &)a僅僅是表達了一個型別資訊,將原記憶體中的資料以整數解釋。因為1.0f在記憶體的表示為0x3f800000,這個數轉換為整數為1065353216。所以第一個輸出為false。而0.0f在記憶體的表示就是0x00000000,所以第二個輸出為true。另外(int)&a表示將a的地址轉換為整數。

問題5:不用區域性變數和全域性變數實現strlen

方法1:利用遞迴實現

[cpp]  view plain copy print ?
  1. int _strlen(char *str)  
  2. {  
  3.     return (str==NULL||*str=='\0')?0 : _strlen(++str)+1;  
  4. }  

方法2:非遞迴,但是用兩個函式來做,效率應該會比方法1高。

[cpp]  view plain copy print ?
  1. char * _end(char *str)  
  2. {  
  3.     while(*str!='\0')  
  4.          str++;  
  5.     return str;   
  6. }  
  7. int _strlen(char *str)  
  8. {  
  9.     return (str==NULL||*str=='\0')?0 : _end(str) - str;  
  10. }