当前位置:首页 > 教育

c语言试题 华为校招15道C语言面试题分享

1.使用预处理指令#define声明一个常数来指示一年中有多少秒(忽略闰年问题)

# define seconds _ per _ year(60 * 60 * 24 * 365)ul我想在这里看到几点:1)。# define语法基础知识(如不以分号结尾,使用括号等。) 2).知道预处理器会为你计算常量表达式的值,所以直接写你如何计算一年的秒数3)。意识到这个表达式将溢出16位机器的整数,所以使用长整数符号l,告诉编译器这个常量是长整数。4)如果您在表达式中使用UL(无符号长整数),那么您就有了一个好的起点。记住,第一印象很重要。

2.写一个“标准”宏MIN,输入两个参数,返回较小的一个。

#定义最小(A,B)((A)& lt;= (B) (A): (B))本测试的设计目的如下:1)识别宏中#define应用的基础知识。这一点非常重要,因为在内联运算符成为标准C语言的一部分之前,宏是方便生成嵌入式代码的唯一途径。对于嵌入式系统,嵌入代码通常是实现所需性能的必要方法。2).三重条件运算符知识。这个操作符之所以存在于C语言中,是因为它能让编译器产生比if-then-else更优化的代码。理解这个用法很重要。3).知道如何在宏中小心地包含参数。4)我也用这个问题开始讨论宏的副作用,比如:你写下面的代码会怎么样?

3.预处理器标志#错误的目的是什么?

如果不知道答案,请参考参考文献1。这个问题对于区分正常人和书呆子很有用。只有书呆子才会去阅读C语言教材的附录,找出这类问题的答案。当然,如果你不是找书呆子,最好希望你不知道答案。

4.无限循环经常在嵌入式系统中使用。用C语言怎么写无限循环?

这个问题有几种解决方法。我比较喜欢的方案是:虽然(1) {}有些程序员比较喜欢下面的方案:对于(;;){}这个实现让我很尴尬,因为这个语法并没有确切的表达是怎么回事。如果一个候选人把这个作为一个计划,我将利用这个机会来探索这样做的基本原则。如果他们的基本答案是:“我是被教会这样做的,但我从来没有想过为什么。”这会给我留下不好的印象。第三个方案是使用转到循环:...goto循环;如果考生给出以上方案,说明他要么是汇编语言程序员(可能是好事),要么是想进入新领域的BASIC/FORTRAN程序员。

5.用变量A给出如下定义

一个整数。b)指向整数int * a的指针;c)指向一个指针的指针,该指针指向一个整数(指向一个整数的指针的指针)intb = 0;int * p = & ampb .int **prt = p&。;d)10个整数的数组int a[10];e)10个指针指向一个整数的数组(10个指针指向整数的数组)int * a[10];一个指向10个整数的数组的指针

int(* a)[10];g)指向具有整数参数并返回整数的函数的指针(指向int (* a) (int)的函数的指针);

取一个整数作为自变量,返回一个整数)h)10个指针指向一个函数的数组,该函数有一个整数参数,返回一个整数(a int(a *[10])(int);

十个指针的数组,指向接受整数参数并返回整数的函数)

答案是:a)int a;//一个整数b)int * a;//一个指向整数c) int **a的指针;//指向整数d) int a[10]的指针的指针;//10个整数的数组e)int * a[10];//10个指针组成的数组,指向整数f)int(* a)[10];//指向10个整数g) int (*a)(int)的数组的指针;//指向函数A的指针,该函数A接受整数参数并返回整数h)int(* A[10])(int);//10个指针组成的数组,指向采用整数的函数

argumentand返回一个整数

人们经常声称这里有几个问题需要翻过来回答。我同意这个说法。当我写这篇文章时,我确实检查了这本书,以确保语法是正确的。但是面试的时候,我期望被问到这个问题(或者类似的问题)。因为面试的时候,我肯定知道这个问题的答案。如果候选人不知道所有的答案(或者至少大部分答案),那么他就没有为面试做准备。如果面试官不准备面试,为什么可以准备?

6.关键字static的作用是什么?

很少有人能完全回答这个简单的问题。在c语言中,关键字static有三个明显的功能:

1).在函数体中,声明为static的变量在这个函数的调用过程中保持其值不变(不会再被复制)。2)在模块中(但在函数外),声明为静态的变量可以被模块中使用的函数访问,但不能被模块外的其他函数访问。它是一个局部全局变量。3)在一个模块中,声明为静态的函数只能被这个模块中的其他函数调用。也就是说,这个函数被限制在声明它的模块的本地范围内。大部分考生能正确回答第一部分,部分能正确回答第二部分,很少有人能理解第三部分。这

这是一个考生的严重缺点,因为他显然不理解本地化数据和代码范围的好处和重要性。

7.const这个关键词是什么意思?

一听到被采访者说“const就是恒量”,我就知道我在和一个外行打交道。去年,DanSaks在他的文章中完整总结了const的所有用法,所以每个ESP(Translator:embedded systems Programming)的读者应该都非常熟悉const能做什么,不能做什么。如果你没看过那篇文章,你可以直接说const的意思是“只读”。虽然这个答案不是一个完整的答案,但我接受它是一个正确的答案。如果你想知道更详细的答案,请仔细阅读萨克斯的文章。如果考生能正确回答这个问题,我再问他一个问题:下面的陈述是什么意思?

const int a;int const a;const int * a;常量int * const a;常量指针int const * a const

前两个功能是一样的。a是一个常数整数。

第三个意思是A是一个指向常量整数的指针(即整数不可修改,但指针可以)。

第四个意思a是一个指向整数的常量指针(即指针指向的整数可以修改,但指针不能修改)。

最后一个是指A是指向常数整数的常数指针(即指针指向的整数不可修改,指针也不可修改)。如果候选人能正确回答这些问题,他会给我留下好印象。顺带一提,你可能会问,即使不用关键字const,也很容易写出功能正确的程序,那我为什么这么关注关键字const呢?我有以下理由:1)关键字const的作用是向阅读你的代码的人传达非常有用的信息。事实上,将一个参数声明为常数是为了告诉用户这个参数的应用目的。如果你花了很多时间清理别人留下的垃圾,你很快就会学会感谢这些多余的信息。(当然,懂得使用const的程序员很少会把垃圾留给别人清理。)2)通过给优化器一些额外的信息,使用关键字const可以产生更紧凑的代码。3)合理使用const关键字,可以让编译器自然地保护那些不想更改的参数,防止被无意的代码修改。总之这样可以减少bug的发生。

8.关键词volatile是什么意思,举三个不同的例子。

定义为volatile的变量意味着该变量可能会被意外更改,因此编译器不会采用该变量的值。准确地说,当使用这个变量时,优化器必须每次都仔细地重新读取这个变量的值,而不是使用存储在寄存器中的备份。以下是一些易变变量的例子:1)并行设备的硬件寄存器(比如状态寄存器)2)在一个中断服务子程序中会被访问的非自动变量3)多线程应用中几个任务共享的变量,不能回答这个问题的就不录用。我觉得这是区分C程序员和嵌入式系统程序员最基本的问题。嵌入式系统程序员经常处理硬件、中断、RTOS等等,所有这些都需要可变变量。不知道易挥发的内容会带来灾难。假设受访者正确回答了这个问题(嗯,不知道会不会是这样),我就稍微深究一下,看看这个家伙是否真的明白volatile的完全重要性。1).参数可以是常量或变量吗?解释一下原因。2).指针可以不稳定吗?解释一下原因。3).以下函数有什么问题:int square(volatile int * ptr){ return * ptr * * ptr;}以下是答案:1)。是的。一个例子是只读状态寄存器。它是不稳定的,因为它可能会被意外更改。它是常量,因为程序不应该试图修改它。2).是的。虽然这不是很常见。一个例子是当中间服务子例程修复一个指向缓冲区的指针时。3).这个代码里有个恶作剧。这段代码的目的是将指针*ptr指向值的平方。但是,因为*ptr指向一个volatile参数,所以编译器会生成如下代码:int square(volatile int * ptr){ int a,b;a = * ptrb = * ptr返回a * b;}因为*ptr的值可能会意外更改,a和b可能会不同。因此,该代码可能不会返回您期望的平方值!正确的代码如下:Longsquare(volatile int * ptr){ int a;a = * ptr返回a * a}

9.嵌入式系统总是要求用户对变量或寄存器进行位操作。给定一个整数变量a,写两段代码,第一段设置a的第3位,第二段清零a的第3位,在以上两个操作中,保持其他位不变。

这个问题有三个基本回答:1)不知道怎么入手。被套没做过什么嵌入式系统的工作。2).使用位字段。位域是扔进C语言角落的东西,它保证了你的代码在不同编译器之间不可移植,也保证了你的代码不可重用。可惜最近看到英飞凌为其更复杂的通信芯片写驱动,用的是位域,所以对我来说完全没用,因为我的编译器用别的方式实现位域。道德上讲:千万不要让一个非嵌入式的家伙粘在真正硬件的边缘。3).使用#定义和位掩码操作。这是一个高度便携的方法,应该使用。最佳解决方案如下:#定义位3 (0x1

10.嵌入式系统通常需要程序员访问特定的内存位置。在一个项目中,需要设置一个绝对地址为0x67a9,值为0xaa66的整数变量。编译器是纯ANSI编译器。编写代码来完成这项任务。

这个问题测试你是否知道为了访问一个绝对地址而将一个整数类型转换成一个指针是合法的。实现这个问题的方式因个人风格不同而异。典型的类似代码如下:int * ptrptr =(int *)0x 67 a9;* ptr = 0x aa 55;

一个晦涩的方法是:*(int * const)(0x 67 a9)= 0x aa 55;

即使你的品味更接近第二种选择,我建议你在面试中使用第一种选择。

11.中断是嵌入式系统的重要组成部分,这导致许多编译器开发人员提供了一种扩展让标准C支持中断。代表性的事实是,一个新的关键字__interrupt已经被创建。下面的代码使用关键字__interrupt来定义中断服务子例程(ISR)。请对此代码进行评论。

_ _ interrupt double compute _ area(double radius){ double area = PI * radius * radius;printf("面积= %f ",面积);返回区域;}

这个函数错误太多,人们不知道从哪里开始:1) ISR不能返回值。如果你不明白这一点,那么你就不会被录用。2).ISR不能传递参数。如果你没有看到这一点,你被录用的机会就等于第一次。3)在很多处理器/编译器中,浮点一般是不可重入的。有些处理器/编译器需要堆栈额外的寄存器,有些处理器/编译器就是不允许ISR中的浮点运算。另外,ISR要短小高效,在ISR中做浮点运算是不明智的。

4)符合第三点,printf()经常有再入和性能问题。如果你输了第三和第四分,我不会对你太苛刻。不用说,如果你能拿到最后两分,你的就业前景会越来越光明。

12.下面的代码输出是什么,为什么?

voidfoo(void) {无符号int a = 6;int b =-20;(a+b >6) ?看跌期权(" >。6 "):看跌期权(" & lt=6");}

这个问题测试你是否知道C语言中整数自动转换的原理。我发现有些开发者对这些东西知之甚少。无论如何,这个无符号整数问题的答案是输出是“>:6”.原因是当表达式中存在有符号类型和无符号类型时,所有操作数都自动转换为无符号类型。因此,-20变成一个非常大的正整数,所以这个表达式计算的结果大于6。这对于应该经常使用无符号数据类型的嵌入式系统非常重要。如果你回答错了这个问题,你将处于得不到这份工作的边缘。

13.评估以下代码片段:

unsigned int zero = 0;无符号int comp zero = 0xfffff;/*1的零补码*/

对于int类型不是16位的处理器,上述代码是不正确的。应该这样写:

无符号int comp zero = ~ 0;

这个问题真的能揭示考生是否理解处理器字长的重要性。以我的经验来看,好的嵌入式程序员非常准确地理解硬件的细节及其局限性,但PC程序往往把硬件视为不可避免的烦恼。在这个阶段,候选人要么完全沮丧,要么信心满满,决心要赢。如果很明显候选人不太好,那么测试到此结束。但是如果很明显候选人做的很好,那么我就抛出下面的附加问题,比较难。我觉得只有非常优秀的考生才能做好。问这些问题的时候,希望看到更多考生处理问题的方式,而不是答案。无论如何,把它当成娱乐...

14.虽然嵌入式系统不像非嵌入式计算机那样常见,但它有一个从堆中动态分配内存的过程。那么嵌入式系统中动态分配内存可能会出现什么问题呢?

在这里,我期望候选人提到内存碎片、碎片收集、变量保持时间等等。这个话题已经在ESP杂志上广泛讨论过了(主要是P.J .普洛伊格,他的解释远远超过我在这里能提到的任何解释),所以回头看看这些杂志吧!让考生进入一种虚假的安全感后,我拿出这样一个小程序:下面的代码片段输出是什么,为什么?

char * ptrif((ptr =(char *)malloc(0))= = NULL)puts(" Got a NULL pointer ");else puts("获得有效指针");

这是一个有趣的问题。最近我的一个同事不小心把0的值传给了malloc函数,得到了一个合法的指针,然后我想到了这个问题。这是上面的代码,这个代码的输出是“Got avalid指针”。我用这个开始讨论这样一个问题,看看受访者是否认为图书馆的套路是正确的。得到正确答案很重要,但问题的解决方法和你决策的基本原则更重要。

15.Typedef在C语言中常用来声明一个已有数据类型的同义词。也可以用预处理器做类似的事情。例如,考虑以下示例:

#定义dPS结构s * typedef结构s * tPS

以上两种情况的意图是将dPS和tPS定义为指向结构s的指针,哪种方法更好?为什么(如果有的话)?这是一个非常微妙的问题,任何一个正确回答这个问题的人(出于正确的原因)都应该受到祝贺。答案是:typedef更好。考虑以下例子:dPS p1,p2;tPS p3,P4;

第一个扩展是结构s * p1,p2;

上面的代码将p1定义为指向一个结构的指针,将p2定义为一个实际的结构,这可能不是您想要的。在第二个例子中,p3和p4指针被正确定义。

内容来源:

http://cd.hqyj.com/

1.《c语言试题 华为校招15道C语言面试题分享》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《c语言试题 华为校招15道C语言面试题分享》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/1457663.html

上一篇

手机带 带升降摄像头的手机能不能买?别急着入手,它有这几个优缺点

下一篇

深圳推行垃圾分类 每年激励补助资金9375万元

编程是什么意思 这些数控编程功能代码是什么意思?你知道吗

f函数 f功能指令用于控制切削进给。在程序中,有两种使用方法。 1.每转进给 编程格式G95 F~ f后面的数字表示主轴每转的进给速度,单位为毫米/转.. 例:G95 F0.2表示进给速度为0.2毫米/秒.. 2.每分...

西北政法大学代码 西北政法大学2018年本科招生章程

西北政法大学代码 西北政法大学2018年本科招生章程

西北政法大学2018年本科招生章程 第一章总则 第一条为规范招生工作,保证招生工作顺利进行,根据《国务院关于深化考试招生制度改革的实施意见》(国发〔2014〕35号)、《教育部关于做好2018年高等学校招生工作的通知》...

北京医保定点医院代码 北京按摩医院等定点医疗机构部分项目变更 最全变更名单在这里

人民网北京10月31日电据北京市人力资源和社会保障局官方微博消息,自2017年10月25日起,市、区医保经办机构决定变更北京按摩医院等17家定点医疗机构的相关项目。关于北京按摩医院等定点医疗机构有关事项变更的通知如下:...

统一社会信用代码是税号吗 今起购买人开发票需填税号或统一社会信用代码

昨日,记者从南宁国税部门了解到,根据国家税务总局的通知,从7月1日起,采购人应开具企业发票,并提供公司纳税人识别号或统一的社会信用代码,否则不会作为涉税业务的税务凭证。据悉,今年5月,国家税务总局发布了《国家税务总局关...

发票购买 今起购买人开发票需填税号或统一社会信用代码

昨日,记者从南宁国税部门了解到,根据国家税务总局的通知,从7月1日起,采购人应开具企业发票,并提供公司纳税人识别号或统一的社会信用代码,否则不会作为涉税业务的税务凭证。据悉,今年5月,国家税务总局发布了《国家税务总局关...

税号和统一社会信用代码一样吗 今起购买人开发票需填税号或统一社会信用代码

昨日,记者从南宁国税部门了解到,根据国家税务总局的通知,从7月1日起,采购人应开具企业发票,并提供公司纳税人识别号或统一的社会信用代码,否则不会作为涉税业务的税务凭证。据悉,今年5月,国家税务总局发布了《国家税务总局关...

购买发票 今起购买人开发票需填税号或统一社会信用代码

购买发票 今起购买人开发票需填税号或统一社会信用代码

昨日,记者从南宁国税部门了解到,根据国家税务总局的通知,从7月1日起,采购人应开具企业发票,并提供公司纳税人识别号或统一的社会信用代码,否则不会作为涉税业务的税务凭证。据悉,今年5月,国家税务总局发布了《国家税务总局关...

notepad2 Notepad2和3 Notepad++对比,代码文本编辑器

  • notepad2 Notepad2和3 Notepad++对比,代码文本编辑器
  • notepad2 Notepad2和3 Notepad++对比,代码文本编辑器
  • notepad2 Notepad2和3 Notepad++对比,代码文本编辑器