您的位置:首页 > 编程语言 > C语言/C++

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

2011-07-23 13:57 375 查看
问题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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: