有点意思的C/C++问题及解答:1-5

来源:互联网 发布:c语言实例编写小游戏 编辑:程序博客网 时间:2024/05/02 00:06

问题1 :写一个交换两个数的宏

方法1:可以用异或运算来做,如果是浮点数,这个方法就不行了

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

方法2:用加减法来做,可能会溢出

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

下面两种其实已经算是函数了。

方法3:用内存复制函数来做

[cpp] view plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  1. int _strlen(char *str)  
  2. {  
  3.     return (str==NULL||*str=='\0')?0 : _strlen(++str)+1;  
  4. }  

方法2:非递归,但是用两个函数来做,效率应该会比方法1高。

[cpp] view plaincopyprint?
  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;  

原创粉丝点击