http://blog.csdn.net/wuzhekai1985/article/details/6615056
问题1 :写一个交换两个数的宏
方法1:可以用异或运算来做,如果是浮点数,这个方法就不行了
- #define _swap(a,b) { a=a^b; b=a^b;a=a^b; }
方法2:用加减法来做,可能会溢出
- #define _swap(a,b) { a=a+b;b=a-b;a=a-b; }
下面两种其实已经算是函数了。
方法3:用内存复制函数来做
- #define _swap(a,b) \
- {\
- char tempBuf[8]; \
- memcpy(tempBuf,&a,sizeof(a)); \
- memcpy(&a,&b,sizeof(b)); \
- memcpy(&b,tempBuf,sizeof(b)); \
- }
当然也可以用动态内存分配
- #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指针,直接传递则参数不匹配。如果非要将类的成员函数作为回调函数,则可以将该函数声明为静态的。例如这样定义:
- 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:以下两条输出语句分别输出什么
- 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:利用递归实现
- int _strlen(char *str)
- {
- return (str==NULL||*str=='\0')?0 : _strlen(++str)+1;
- }
方法2:非递归,但是用两个函数来做,效率应该会比方法1高。
- char * _end(char *str)
- {
- while(*str!='\0')
- str++;
- return str;
- }
- int _strlen(char *str)
- {
- return (str==NULL||*str=='\0')?0 : _end(str) - str;
- }