C语言面试题目

 

试题1:分别给BOOLintfloat,指针变量 与“零”比 if 句(假设变量名var

解答:

BOOL量:if(!var)

int量:   if(var==0)

float量:

const float EPSINON = 0.00001;

if ((x >= - EPSINON) && (x <= EPSINON)

针变量:  if(var==NULL)

 

 

试题2:以下Windows NT下的32C++程序,请计sizeof

void Func ( char str[100] )

{

     sizeof( str ) = ?

}

void *p = malloc( 100 );

sizeof ( p ) = ?

解答:

sizeof( str ) = 4

sizeof ( p ) = 4

 

 

名的本如下:

1)数名指代一数据构,这种数据构就是数

例如:

char str[10];

cout << sizeof(str) << endl;

10str指代数据char[10]

2)数名可以转换为指向其指代体的指,而且是一个指常量,不能作自增、自减等操作,不能被修改;

char str[10];

str++;   //编译,提示str不是左 

3)数名作函数形参沦为普通指

Windows NT 32位平台下,指度(占用内存的大小)4,故sizeof( str )

sizeof ( p ) 4

 

试题3:写一个“准”宏MIN个宏入两个参数并返回小的一个。另外,当你写下面的代码时生什事?

least = MIN(*p++, b);

解答:

#define MIN(A,B)    ((A) <=  (B) ? (A) : (B))

MIN(*p++, b)生宏的副作用

 

试题4么标文件都有似以下的构?

   #ifndef __INCvxWorksh

   #define __INCvxWorksh

   #ifdef __cplusplus

   extern "C" {

   #endif

   /*...*/

   #ifdef __cplusplus

   }

   #endif

   #endif /* __INCvxWorksh */

   解答:

文件中的编译

#ifndef __INCvxWorksh

#define __INCvxWorksh

#endif

的作用是防止被重引用。

面向象的言,C++支持函数重,而程式C不支持。函数被C++编译后在symbol中的名字与C言的不同。例如,假某个函数的原型

void foo(int x, int y);

函数被C编译编译后在symbol中的名字_foo,而C++编译生像_foo_int_int的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及型信息,C++就是考这种机制来实现函数重的。

实现CC++的混合程,C++提供了C接交指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C言的方式将函数编译为_foo这样C言中就可以C++的函数了。

 

 

试题5写一个函数,作用是把一个char成的字符串循右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh

函数这样的:

//pStr是指向以'/0'尾的字符串的指

//steps是要求移n

void LoopMove ( char * pStr, int steps )

{

//填充...

}

解答:

正确解答1

void LoopMove ( char *pStr, int steps )

{

    int n = strlen( pStr ) - steps;

    char tmp[MAX_LEN];   

    strcpy ( tmp, pStr + n );

    strcpy ( tmp + steps, pStr);   

    *( tmp + strlen ( pStr ) ) = '/0';

    strcpy( pStr, tmp );

}

正确解答2

void LoopMove ( char *pStr, int steps )

{

    int n = strlen( pStr ) - steps;

    char tmp[MAX_LEN];   

    memcpy( tmp, pStr + n, steps );  

    memcpy(pStr + steps, pStr, n );   

    memcpy(pStr, tmp, steps );   

}

剖析:

试题主要考对标函数的熟程度,在需要的候引用函数可以很大程度上化程序写的工作量。

繁被使用的函数包括:

1       strcpy

2       memcpy

3       memset

 

试题7String的构造函数、析构函数和赋值函数,已知String的原型

class String

{      

public:      

  String(const char *str = NULL); // 普通构造函数    

  String(const String &other); // 构造函数   

  ~ String(void); // 析构函数 

  String & operate =(const String &other); // 赋值函数      

private:     

  char *m_data; // 用于保存字符串      

};

解答:

//普通构造函数

String::String(const char *str)

{

       if(str==NULL)

       {

               m_data = new char[1]; // 得分点:空字符串自存放'/0'的空

                                           //加分点:m_dataNULL 判断

               *m_data = '/0';

       }    

       else

       {

        int length = strlen(str);

        m_data = new char[length+1]; // 若能加 NULL 判断更好

        strcpy(m_data, str);

       }

}

// String的析构函数

String::~String(void)

{

       delete [] m_data; // delete m_data;

}

//构造函数

String::String(const String &other)    // 得分点:入参数const

{     

       int length = strlen(other.m_data);

       m_data = new char[length+1];     //加分点:m_dataNULL 判断

       strcpy(m_data, other.m_data);    

}

 

//赋值函数

String & String::operate =(const String &other) // 得分点:入参数const

{     

       if(this == &other)                   //得分点:检查赋值

               return *this;   

       delete [] m_data;               //得分点:放原有的内存

       int length = strlen( other.m_data );      

       m_data = new char[length+1];  //加分点:m_dataNULL 判断

       strcpy( m_data, other.m_data );   

       return *this;            //得分点:返回本象的引用

}

剖析:

 

准确无写出String的构造函数、拷构造函数、赋值函数和析构函数的面者至少已C++基本功的60%以上!

中包括了指针类员变m_data,当中包括指针类员变,一定要重其拷构造函数、赋值函数和析构函数,既是C++程序的基本要求,也是《Effective C++》中特别强调的条款。

 

 

试题:写一个函数返回1+2+3++n(假定果不会超过长整型量的范

解答:

int Sum( int n )

{

       return  ( (long)1 + n) * n / 2;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值