有點意思的C/C++問題及解答:1-5
問題1 :寫一個交換兩個數的巨集
方法1:可以用異或運算來做,如果是浮點數,這個方法就不行了
[cpp] view plain copy print ?
- #define _swap(a,b) { a=a^b; b=a^b;a=a^b; }
方法2:用加減法來做,可能會溢位
[cpp] view plain
- #define _swap(a,b) { a=a+b;b=a-b;a=a-b; }
下面兩種其實已經算是函數了。
方法3:用記憶體複製函式來做
[cpp] view plain copy print ?
- #define _swap(a,b) \
- {\
- char tempBuf[8]; \
- memcpy(tempBuf,&a,sizeof(a)); \
- memcpy(&a,&b,sizeof(b)); \
- memcpy(&b,tempBuf,sizeof
- }
當然也可以用動態記憶體分配
[cpp] view plain copy print ?
- #define _swap(a, b)\
- {\
- int size = sizeof(a);\
- char* temp = (char*)malloc(size);\
- memcpy(temp, &a, size);\
- memcpy(&a, &b, size);\
- memcpy(&b, temp, size);\
- free(temp);\
- }
問題2:定義和實現一個類的成員函式為回撥函式
回撥函式的運用的主要技術是函式指標。即將函式指標作為函式的引數之一,然後在這個函式內部通過函式指標,呼叫函式指標所指的函式。
在C++中,類的成員函式隱含了this指標,直接傳遞則引數不匹配。如果非要將類的成員函式作為回撥函式,則可以將該函式宣告為靜態的。例如這樣定義:
[cpp] view plain copy print ?
- class Test
- {
- public:
- static void callBackFun(void){}; //因為callBackFun預設有一個const Test* 的指標
- };
- typedef void (*FPtr)(void);
- void Fun(FPtr ptr)
- {
- ptr();
- }
- void main(void)
- {
- Fun(Test::callBackFun);
- }
問題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 ?
- float a = 1.0f;
- cout << (int)a << endl;
- cout << (int&)a << endl;
- cout << boolalpha << ( (int)a == (int&)a ) << endl; // 輸出什麼?
- float b = 0.0f;
- cout << (int)b << endl;
- cout << (int&)b << endl;
- 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 ?
- int _strlen(char *str)
- {
- return (str==NULL||*str=='\0')?0 : _strlen(++str)+1;
- }
方法2:非遞迴,但是用兩個函式來做,效率應該會比方法1高。
[cpp] view plain copy print ?
- char * _end(char *str)
- {
- while(*str!='\0')
- str++;
- return str;
- }
- int _strlen(char *str)
- {
- return (str==NULL||*str=='\0')?0 : _end(str) - str;
- }