分享

详解一下C/C 面试题

 豫龙晏子 2017-02-16

小编今天给大家详细解答一下一些经典的面试题,这些问题不仅在平时学习中会遇到,以后工作中也有很大的可能性会遇到的,希望详解一下,会给准备以后从事编程的各位有所帮助吧。因为之前找工作面试的时候,遇到的一些问题,现在就结合考查的知识点和我总结完 C 语言再学习后的深入理解。

一、请填写BOOL , float,指针变量 与“零值”比较的if语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如int变量n与“零值”

比较的 if语句为:

if ( n == 0 )

if ( n != 0 )

以此类推。

1、请写出BOOL flag与“零值”比较的if语句:

标准答案:

if ( flag )

if ( !flag )

如下写法均属不良风格,不得分。

if (flag == TRUE)

if (flag == 1 )

if (flag == FALSE)

if (flag == 0)

2、请写出 float x与“零值”比较的if语句:

标准答案示例:

const float EPSINON = 0.00001;

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

不可将浮点变量用“ ==”或“! =”与数字比较,应该设法转化成“ >=”或“ <>

如下是错误的写法,不得分。

if (x == 0.0)

if (x != 0.0)

3、请写出 char *p与“零值”比较的if语句:

标准答案:

if (p == NULL)

if (p != NULL)

如下写法均属不良风格,不得分。

if (p == 0)

if (p != 0)

if (p)

if (!)

解答:

1、根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。

详解一下C/C++面试题

加群466572167,群内有学习资料

2、在浮点数比较中不能使用 < 和="">,千万要留意,无论是 float 还是 double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<>

请写出 float x与“零值”比较的 if语句

const float EPSINON = 0.000001;

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

或者 if ( fabs (x) <=>

// fabs (x) 取 x 的绝对值,其中EPSINON是允许的误差(即精度)。

3、参看:C语言再学习 -- NUL和NULL的区别

NULL用于表示什么也不指向,也就是空指针((void *)0)

详解一下C/C++面试题

加群466572167,群内有学习资料

程序员为了防止将 if (p == NULL) 误写成 if (p = NULL),而有意把 p 和 NULL 颠倒。编译器认为 if (p = NULL) 是合法的,但是会指出 if (NULL = p)是错误的,因为 NULL不能被赋值

扩展:在表达式中使用无符号数

库函数 strlen 的原型如下:

size_t strlen (char const *string);

注意:strlen 返回一个类型为 size_t 的值。这个类型是在头文件 stddef.h 中定义的,它是一个无符号整数类型。在表达式中使用无符号数可能导致不可预料的结果。例如下面的表达式:

详解一下C/C++面试题

加群466572167,群内有学习资料

但 strlen (ptr1) - strlen (ptr2) 为无符号类型,得不到想要的结果,应该为 if (strlen (ptr1) >= strlen (ptr2))

详解一下C/C++面试题

加群466572167,群内有学习资料

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

void Func ( char str[100])

{

请计算

sizeof( str ) = 4

}

char str[] = “Hello” ;

char *p = str ;

int n = 10;

请计算

sizeof (str ) = 6

sizeof ( p ) = 4

sizeof ( n ) = 4

void *p = malloc( 100 );

请计算

sizeof ( p ) = 4

解答:关键字sizeof与strlen

记住这两句话:

在 32 位系统下,不管什么样的指针类型,其大小都为 4 byte。

参数传递数组永远都是传递指向数组首元素的指针。

三、简答题(25分)

1、头文件中的ifndef/define/endif干什么用?

答:防止该头文件被重复引用。

2、#include 和#include “filename.h”有什么区别?

答:对于#include ,编译器从标准库路径开始搜索 filename.h

对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h

3、const有什么用途?(请至少说明两种)

( 1)可以定义 const 常量

( 2) const 可以修饰函数的参数、返回值,甚至函数的定义体。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

4、在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”声明?

答: C++语言支持函数重载, C 语言不支持函数重载。函数被 C++编译后在库中的名字与 C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该 函 数 被 C 编 译 器 编 译 后 在 库 中 的 名 字 为 _foo, 而 C++编 译 器 则 会 产 生 像_foo_int_int 之类的名字。C++提供了 C 连接交换指定符号 extern“ C”来解决名字匹配问题。

5、请简述以下两个for循环的优缺点

// 第一个

详解一下C/C++面试题

加群466572167,群内有学习资料

优点:程序简洁

缺点:多执行了 N-1 次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。

// 第二个

详解一下C/C++面试题

加群466572167,群内有学习资料

优点:循环的效率高

缺点:程序不简洁

就仅仅的几个问题,但是写的也挺多的,一下子写太多,看上去也会有疲劳感,加群466572167,群内有学习资料,可以交流学习,希望对各位有所帮助吧,每一个点解释有点多,会不会感觉有点啰嗦呢,要是有的话,可以提出一下,希望对各位有所帮助吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多