C语言笔试小题目

  • 题目及解析

题目及解析

1、什么是预编译,何时需要预编译?
答:预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。c编译系统在对程序进行通常的编译之前,先进行预处理。
c提供的预处理功能主要有以下三种:
1)宏定义 2)文件包含 3)条件编译

2、关键字const是什么含意?
总的来讲就是类似只读的意思

  1. 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
  2. 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
  3. 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现
const int a;// a是一个常整型数
int const a;// a是一个常整型数
const int *a;// a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
int * const a;// a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)
int const * a const;// a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

3、关键字volatile有什么含意 并给出三个不同的例子。
答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。通俗的讲,就是自动分配的变量值前后会不一致。下面是volatile变量的几个例子:

  1. 并行设备的硬件寄存器(如:状态寄存器)
  2. 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
  3. 多线程应用中被几个任务共享的变量

(1)一个参数既可以是const还可以是volatile。
例子:只读的状态寄存器。
它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
(2). 一个指针可以是volatile 。
例子:是当一个中服务子程序修该一个指向一个buffer的指针时。
(3). 下面的函数:

int square(volatile int *ptr)
{return *ptr * *ptr;
}

这段代码的有个恶作剧。这段代码的目的是用来返指针ptr指向值的平方,但是由于ptr指向一个volatile型参数,编译器将产生类似下面的代码

int square(volatile int *ptr)
{int a,b;a = *ptr;b = *ptr;return a * b;
}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)
{int a;
a = *ptr;
return a * a;
}

4、三种基本的数据模型
答:按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型。

5、结构体与联合体有和区别?
答:
(1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。
(2)对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的

6、描述内存分配方式以及它们的区别?
答:
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多

7、请说出const与#define 相比,有何优点?
答:Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

8、简述数组与指针的区别?
答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。
(1)修改内容上的差别

char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误,运行时错误

(2) 用运算符sizeof 可以计算出数组的容量(字节数)。
sizeof( p),p 为指针得到的是一个 指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

char a[] = “hello world”;
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节

计算数组和指针的内存容量

void Func(char a[100])
{cout<< sizeof(a) << endl; // 4 字节而不是100 字节
}

9、分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。
答:
BOOL : if ( !a ) 或者 if(a)
int : if ( a = = 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)

10、如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
答:
#ifdef __cplusplus
cout<<“c++”;
#else
cout<<“c”;
#endif

11、论述含参数的宏与函数的优缺点
答:

带参宏 函数
处理时间 编译时 程序运行时
参数类型 没有参数类型问题 定义实参、形参类型
处理过程 不分配内存 分配内存
程序长度 变长 不变
运行速度 不占运行时间 调用和返回占用时间

12、用两个栈实现一个队列的功能?要求给出算法和思路!
答:设2个栈为A,B, 一开始均为空.
入队:
将新元素push入栈A;
出队:
(1)判断栈B是否为空;
(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;
(3)将栈B的栈顶元素pop出;
这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好
13、嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
答:
这个问题用几个解决方案。我首选的方案是:
while(1){}
一些程序员更喜欢如下方案:
for(;; ){}
第三个方案是用 goto
Loop:

goto Loop;
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

14、位操作(Bit manipulation)
答: 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应
1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{a |= BIT3;
}
void clear_bit3(void)
{a &= ~BIT3;
}

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

15、访问固定的内存位置(Accessing fixed memory locations)
答:嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;

一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。

16、中断(Interrupts)
答: 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)
{double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}

这个函数有错误
1)ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

17、typedef
答:
typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。
思考一下下面的例子:

#define dPS struct s *
typedef struct s * tPS;

以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。
哪种方法更好呢?(如果有的话)为什么?
这是一个非常微妙的问题,答案是:typedef更好。
因为:

dPS p1,p2;
tPS p3,p4;

第一个扩展为

struct s * p1, p2;

上面的代码定义p1为一个指向结构的指针,但p2为一个实际的结构体不是指针。
第二个例子可以正确地定义p3 和p4 两个指针。

18、用变量a给出下面的定义
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)
d) 一个有10个整型数的数组(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer
argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

19、写一个“标准”宏
答:交换两个参数值的宏定义为:.

#define SWAP(a,b) \
(a)=(a)+(b);\
(b)=(a)-(b);\
(a)=(a)-(b);

输入两个参数,输出较小的一个:

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

表明1年中有多少秒(忽略闰年问题):

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
#define DOUBLE(x) x+x #define DOUBLE(x) ((x)+(x))
i = 5*DOUBLE(5); i为30 i = 5*DOUBLE(5); i为50
5*5+5=30 5*(5+5)=50

已知一个数组table,用一个宏定义,求出数据的元素个数

#define NTBL (sizeof(table)/sizeof(table[0]))

20、A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
答:static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。
他们都放在数据区,但是编译器对他们的命名是不同的。
如果要使变量在其他模块也有意义的话,需要使用extern关键字。

21、一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
答:将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。

题海拾贝No.8|C语言笔试小题目集锦相关推荐

  1. c语言中不带任何修饰符的浮点变量,江苏省计算机等级考试二级C语言笔试辅导题目...

    <江苏省计算机等级考试二级C语言笔试辅导题目>由会员分享,可在线阅读,更多相关<江苏省计算机等级考试二级C语言笔试辅导题目(155页珍藏版)>请在装配图网上搜索. 1.1 江苏 ...

  2. 2005年4月全国计算机等级考试二级C语言笔试试题及答案

    2005年4月全国计算机等级考试二级C语言笔试试题及答案 一.选择题((1)-(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A).B).C).D)四个选项中,只有一个选项是正确 ...

  3. 关于c语言程序开发过程 下面说法错误的是,c语言笔试真题

    下面由我们YJBYS求职网专家为您分享关于二级c语言笔试真题,请您参考: 函数fun 的功能是:计算正整数n 的所有因子(1 和n 除外)之和作为 函数值返回. 例如:n=120 时,函数值为239. ...

  4. 省二c语言笔试试卷,2005年春浙省二级C语言笔试试卷.doc

    2005年春浙省二级C语言笔试试卷 2005年春浙江省高校非计算机专业学生 计算机等级考试试卷 (二级C) 试题一.判断题(每小题1分,共10分) 说明:在以下提供的若干个陈述中,逐一判断其正确与否, ...

  5. 二级c语言笔试58,全国计算机等级考试-二级C语言笔试试题.doc

    全国计算机等级考试-二级C语言笔试试题 2002年4月全国计算机等级考试二级C语言笔试真题试题(含参考答案) 一.选择题(1)-(40)题每小题1分,(41)-(50)题每小题2分,共计60分.下 ...

  6. 2004年9月全国计算机等级考试二级C语言笔试试题

    2004年9月全国计算机等级考试二级C语言笔试试题 更新于:2007年9月20日   念时 一.选择题((1)-(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A).B).C ...

  7. 华为c语言笔试形式,最新华为C语言笔试题目分享

    最新华为C语言笔试题目分享 华为C语言笔试题目分享: 一.判断 1.有数组定义inta[2][2]={{1},{2,3}};则a[0][1]的值为0.() 2.int(*ptr)(),则ptr是一维数 ...

  8. 1998年4月全国计算机等级考试二级C语言笔试试题

    1998年4月全国计算机等级考试二级C语言笔试试题 更新于:2007年9月19日   念时 一.选择题((1)-(40)每小题1分,(41)-(50)每小题2分,共60分)    下列各题 A).B) ...

  9. 知名外企嵌入式C语言笔试试题

    知名外企嵌入式C语言笔试试题 嵌入式C语言笔试试题 知名外企嵌入式C语言笔试试题 一. 选择题 二. 填空题 三.写出程序的运行结果 一. 选择题 01.C语言合法的常量是() A-45 B.078 ...

最新文章

  1. 如果你只做自己能力范围内的事,那么你永远没法进步
  2. 程序员面试题精选100题(55)-不用+、-、×、÷做加法[算法]
  3. 英伟达jetson tx1开发套件配置tensorflow
  4. 回归素材(part7)--机器学习入门到实战-MATLAB实践应用
  5. 如何计算一年总共有多少周_一年有几个周?怎么计算周数及闰年?
  6. oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据
  7. python cocos2dx_cocos2dx 3.0 环境搭建、项目编译于运行
  8. 杭电2002(我们没有什么不同)
  9. 倾斜摄影三维模型OSGB格式简化(压缩、优化)
  10. exe打包工具,封装exe安装程序--Inno Setup
  11. 基于java jsp企业人事管理系统mysql
  12. SpringBoot---Tomcat日志配置
  13. idea 光标 快捷键_idea 快捷键汇总
  14. 华为S/CE系列交换机stelnet示例(带外管理地址绑定vpn实现业务和管理平面的隔离)
  15. iOS 打包上传蒲公英和AppStore出问题
  16. onMeasure(int widthMeasureSpec, int heightMeasureSpec)
  17. 一文搞定bp神经网络,bp神经网络的实现
  18. 国稻种芯百团计划行动 下好先手棋安徽“育繁推一体化”格局
  19. 机器学习实战笔记 第二章(1)
  20. 色素疤痕应该如何修复?(色素沉着疤痕怎么修复)

热门文章

  1. php java bridge 安装_浅谈在linux下安装php-java-bridge
  2. Java Virtual Machines Memory Explained
  3. Creating A Moddable Unity Game
  4. RemoteSensing投稿流程
  5. 基于MATLAB的人体行为检测与识别
  6. 解密PDF文件的密码
  7. 03-Docker-配置用户组及加速器
  8. fmri的图像数据在matlab中显示,利用imagesc工具进行显示,自带数据集-by 西南大学xulei教授...
  9. D3D12渲染技术之根签名
  10. go-elasticSearch实战篇,带你学会elasticSearch的增删改查