- 一、请填写BOOL, float, 指针变量 与 “零值”比较的if语句。
请写出BOOL flag 与 "零值"比较的if语句:
if(flag)
if(!flag)
整型变量与零值比较
if(value == 0)
if(value != 0)
浮点变量与零值比较
float x = 0.000001;
float 4位 精度为7位有效数字, 如果小于0.000001,则不在有效精度范围内,被认为都是0,
if(DATA >= -X && DATA <= X);
指针变量与0比较
if(p == NULL);
if(p != NULL);
不要写成
if(p == 0);//容易让人误解P是整型变量
if(p != 0);
2.二、以下为Windows NT下的32位C++程序,请计算sizeof的值
char str[] = "hello";
char *p = str;
int n = 10;
sizeof(str) = 6; //不要忘记“/0”
sizeof(p) = 4; //32位指针是4个字节
sizeof(n) = 4;
void Func(char str[100]){
sizeof(str) = 4; //STR是指针
}
void *p = malloc(100)
sizeof(p) = 4;
1 头文件中的ifndef/define/endif作什么用?
1,比如你有两个C文件,都加了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。
2 //#include <filename.h>和#include "filename.h"有什么区别
//<>查系统文件比较快 ,"" 查路径快
3 const有什么用途(请至少说明两种)
//const修饰的数据类型是指常类型
1.可以定义const常量
const int i = 100;
2.可以保护被修饰的东西,防止意外的修改。
3.便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改;
4.可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
5. 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
请简述以下两个for循环体的优缺点
第一个
for(i =0; i < n; i++)
{
if(conditon)
DoSomething();
else
DoSomething();
}
第二个
if(condition)
{
for(i = 0; i < n; i++)
DoSomething();
}
else
{
for(i = 0; i < n; i++)
DoSomething();
}
第一个
缺点:性能较低,每次循环都有一次条件判断;
优点:可读性高,可扩展性高。
第二个
优点:性能较高,循环内没有条件判断。
缺点:不好扩展,如果加入新的条件,改动的代码过多,体积臃肿。
四、有关内存的思考题
第一道
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
程序崩溃。 str一直指向NULL。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
可能是乱码。 GetMemory 返回是指向 “栈内存” 的指针。
五、编写strcpy函数
已知strcpy函数的原型是:char *strcpy(char *strDest, const char *strSrc)
其中strDest是目的字符串,strSrc是源字符串
#include <stdio.h>
char *strcpy(char *strDest, const char *strSrc)
{
if(strDest == NULL || strSrc == NULL)
return NULL;
if(strDest == strSrc)
return strDest;
char *ret = strDest;
while((*strDest++ = *strSrc++)!= '\0');
return ret;
}