笔试题1

  1. 一、请填写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,则不在有效精度范围内,被认为都是0if(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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值