有点意思的C/C++问题及解答:1-5
2011-07-23 13:57
375 查看
问题1 :写一个交换两个数的宏
方法1:可以用异或运算来做,如果是浮点数,这个方法就不行了
方法2:用加减法来做,可能会溢出
下面两种其实已经算是函数了。
方法3:用内存复制函数来做
当然也可以用动态内存分配
问题2:定义和实现一个类的成员函数为回调函数
回调函数的运用的主要技术是函数指针。即将函数指针作为函数的参数之一,然后在这个函数内部通过函数指针,调用函数指针所指的函数。
在C++中,类的成员函数隐含了this指针,直接传递则参数不匹配。如果非要将类的成员函数作为回调函数,则可以将该函数声明为静态的。例如这样定义:
问题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:以下两条输出语句分别输出什么
输出分别为 false 和 true 。(int)a是进行类型转换,相当于重新构造了一个值等于a的整数。而(int &)a仅仅是表达了一个类型信息,将原内存中的数据以整数解释。因为1.0f在内存的表示为0x3f800000,这个数转换为整数为1065353216。所以第一个输出为false。而0.0f在内存的表示就是0x00000000,所以第二个输出为true。另外(int)&a表示将a的地址转换为整数。
问题5:不用局部变量和全局变量实现strlen
方法1:利用递归实现
方法2:非递归,但是用两个函数来做,效率应该会比方法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; }
相关文章推荐
- 有点意思的C/C++问题及解答:6-10
- 有点意思的C/C++问题及解答:6-10
- 有点意思的C/C++问题及解答:11-15
- 有点意思的C/C++问题及解答:1-5
- 有点意思的C/C++问题及解答:6-10
- 有点意思的C/C++问题及解答:11-15
- 有点意思的C/C++问题及解答:16-20
- 有点意思的C/C++问题及解答:16-20
- 有点意思的C/C++问题及解答:16-20
- 有点意思的C/C++问题及解答:21-25
- 有点意思的C/C++问题及解答:1-5
- 有点意思的C/C++问题及解答:11-15
- 有点意思的C/C++问题及解答:21-25
- 有点意思的C/C++问题及解答:21-25
- 有点意思的C/C++问题及解答:6-10
- 有点意思的C/C++问题及解答:1-5
- 有点意思的C/C++问题及解答:11-15
- 有点意思的C/C++问题及解答:16-20
- 有点意思的C/C++问题及解答:21-25
- C++新手常见的问题与解答