求职攻略| 答题,永不过时的C语言(大华FPGA岗解析)

首页-达尔闻    全部    求职攻略| 答题,永不过时的C语言(大华FPGA岗解析)

除了考察FPGA和逻辑相关的知识外,大华FPGA岗的笔试题还有很多C语言的题目。

作为FPGA工程师肯定要更精通于逻辑,为什么还要熟悉C语言呢?其实在FPGA的开发中常使用到嵌入式软、硬核,这就需要FPGA工程师也要熟悉C语言才能更好的协同开发。另外通过HLS开发时也需要有C语言的功底,甚至要会C++才更好。如果要精通于验证,还要会SystemVerilog。如果在Linux中开发,还要学习Python、Tcl、Shell、Perl、Makefile等脚本提高开发的效率。图片综上,做FPGA开发不仅仅要精通HDL语言,还要学习更多相关的内容才能让自身更具有优势,这就需要大家在平时的学习中多积累,做到既有硬件思维又有软件思维,并且还能做到切换自如。下面就让我们一起来看一下今天的题目。

16)程序运行后的输出结果是(    )

A 30     B 40     C 10    D 20

 

解析:本题目主要考察了C语言数组和指针相关的知识

首先我们按顺序解读一下这个程序。该程序只有一个主函数,从main函数开始。

第5行定义一个整型的一维数组a,并分别赋值为a[0] = 10,a[1] = 20,a[2] = 30,a[3] = 40,所以该一维数组有4个元素。第6行定义一个整型的指针变量p。第7行定义一个整型变量i。第8行将数组a的地址赋值给指针p,(关于数组和指针的对应关系请参看“求职‘笔试经’第十四弹:这道C语言数组题仅一半人答对?(华为硬件逻辑岗)”中第37题),所以*p = a[0] = 10,*p+1 = a[1] = 20,*p+2 = a[2] = 30,*p+3 = a[3] = 40。

第9行是一个for循环,循环变量i的初值是0,从0到3循环4次,每次循环后i的值自加1。

第11行为for循环中所要执行的语句,赋值号右边考察了运算符的优先级,指针运算符“*”和前置自增运算符“++”的优先级相等,所以按照从左往右的优先级规则,先取值,然后指针p再自加1,所以i=0时a[0] = *p = 10,p+1;i = 1时a[1] = *(p+1) = 20,p+2;i = 2时a[2] = *(p+2) = 30,p+3;i = 3时a[3] = *(p+3) = 40,p+4;i = 4时退出for循环。

第12行打印a[2]的值为30。同时也经CodeBlocks验证,答案选A

 

17)程序运行后的输出结果是(    )

A 1, 3         B 0, 2

C 0, 3         D 1, 2

 

解析:本题主要考察了C语言前置自增运算符和后置自增运算符的区别

首先我们按顺序解读一下这个程序:

第5行定义一个整型变量a。

第6行定义一个整型变量b。

第7行将-2赋值给变量a。

第8行将0赋值给变量b。

第9行是一个while语句,如果while括号中的语句为真则一直执行,为假时跳出。再来看while括号中的语句,发现没有括号,要先确定优先级,其中后置自增运算符“++b”的优先级 > 前置自增运算符“a++” > 逻辑与运算符“&&”,也等价于((a++) && (++b)),a++是先赋值后自加1,++b是先自加1后赋值。

第1次执行while语句时,a = -2,b = 0,b需要先自加1后为1,((a++) && (++b)) = (-2 && 1)的结果为真,继续执行while语句,然后a需要自加1,该次循环结束时a = -1,b = 1。

第2次执行while语句时,a = -1,b = 1,b需要先自加1后为2,((a++) && (++b)) = (-1 && 2)的结果为真,继续执行while语句,然后a需要自加后1,该次循环结束时a = 0,b = 2。

第3次执行while语句时,a = 0,b = 2,b需要先自加1为3,((a++) && (++b)) = (0 && 3)的结果为假,跳出while语句,然后a需要自加1,该次循环结束时a = 1,b = 3。很多同学分析到这里就选择了A选项,但是经CodeBlocks验证得到的结果如下所示:

难道是哪里分析错了吗?其实问题就出现了第3次执行while的时候,第3次循环开始 时a = 0,b = 2。因为a = 0,此时while判断a不满足条件,然后执行a自加1操作后a = 1。因为while语句的条件不满足,循环体不会执行++b,所以b的值没有变化,答案选D

 

18)在C语言中,执行下列语句后,c的值为(    )

A 12     B 13    C 8     D 程序出错

 

解析:本题主要考察了C语言变量定义的基础知识

这个题目看上去代码比较多,其实错误显而易见,我们发现c自始至终都没有被定义过,这样在程序编译的时候自然会报错。在CodeBlocks中运行的报错如下所示:

所以该题选D

 

19)在C语言中,有如下程序段:

int *p, a = 10, b = 1 ;

p = &a;

a = *p+b;

执行该程序后,a的值为(    )

A 10    B 11    C 12    D 编译出错

 

解析:本题主要考察了C语言指针的基础知识

代码一共有三句,逐句分析。

第一句定义了一个整型的指针变量p,一个整型的变量a并赋初值为10,一个整型变量b并赋初值为1。

第二句将变量a的地址赋值给指针p。

第三句*p就是取指针p的值,为10,然后再加上b的值为1,结果再赋值给a,所以a为11。同时也经CodeBlocks验证,答案选B。

 

20)已知int i = 1, j = 3, k = 5;执行以下程序后,i, j, k的值是(    )

if(i > j)

    k = i; i = j; j = k;

A i = 1, j = 3, k = 5

B i = 3, j = 5, k = 5

C i = 3, j = 5, k = 1

D i = 3, j = 5, k = 3

 

解析:本题主要考察了C语言语句顺序执行和括号的认识

首先题干中分别定义三个整型变量并赋值,然后if语句判断i和j的大小,根据题干可以知道i = 1,j = 3,i > j不成立为假,所以不会执行k = i这条语句,所以k还是为5,但是会按照顺序执行i = j和j = k,所以i = 3,j = 5。同时也经CodeBlocks验证,答案选B

 

21)设有定义:int x[2][3];则以下关于二维数组x的叙述错误的是(    )

A x[0]可看作是由3个整型元素组成的一维数组

B x[0]和x[1]是数组名,分别代表不同的地址常量

C 数组x包含6个元素

D 可以用语句x[0] = 0; 为所有元素赋初值0

 

解析:本题主要考察了C语言中二维数组的相关知识

在二维数组中,不能使用x[0] = 0这样的赋值语句。x[0]代表一个一维数组。x[0]是一个指针,指向了x[0][0]的位置,赋初值应该一个个元素赋值,或是在一个一维数组中组合起来赋初值,所以D选项错误,其余三个选项的描述都是正确的。

 

22)在C语言中,函数的隐含存储类别是(    )

A 无存储类别      B static

C extern          D auto

 

解析:本题主要考察了C语言中函数的隐含存储类型

auto 只是用于局部变量,register一定是auto。函数的存储类型指的是其他文件模块可否访问,按照C语言的原则,函数隐含为全局(本项目中)都可以访问,因此默认为extern,如果函数前面加上static则说明该函数只能被本源程序文件中的模块访问,所以答案就是C

 

2021年3月5日 10:38
收藏