这是C语言数组背后隐藏的基础知识意义吗?(一)

在C语言程序开发中,程序员在定义数组的时候可以初始化数组,只允许初始化部分元素。没有明确初始值的元素将被设置为零,例如:

int a[5] = {1, 2};这行C代码执行完后,数组a中的元素会是1,2,0,0,0。这就是C语言数组的基础知识点。但遗憾的是,从我昨天在圈子里分享的一个面试题来看,还是有一些C语言程序员认为没有显式给初始值的数组元素的值是未定义的。以下是某国外嵌入式公司的面试题。有人在 StackOverflow 上提问,比较有意思:

国外嵌入式公司面试题

离题

好像每次分享一些面试题,都会有人认为我是“孔乙己”,纠结这些面试题是没有意义的。但这真的没有意义吗?首先要明确的是,分析面试题并不是要在面试题中鼓吹C语言代码编写方法嵌入式软件开发面试c语言笔试题 答案,而是讨论隐藏在其背后的基础知识。例如,如果读者不了解 C 中数组初始化的本质,就无法得到这个问题的正确答案。

离题

其实很多公司在招聘的时候嵌入式软件开发面试c语言笔试题 答案,都会有一些面试题或者笔试题,看起来很诡异,不符合标准的开发规范,所以有些程序员认为做这样的面试题是完全没有意义的。但实际上,这些问题可能来自公司内部某个项目的一个重大bug。在短暂的面试时间内不可能完整地描述这个bug,所以只好抽象成一个看起来很“不常见”的面试问题。调查求职者。

如果求职者基础薄弱,以后可能会犯同样的错误,这是不允许的。所以,对于我们的求职者来说,当我们通常收到这些面试问题时,首先想到的应该是其背后隐藏着哪些知识点。

分析

有很多读者看到标题就立马写了相关的C语言代码并在自己的设备上编译执行,但似乎得到了两个答案,如下图,这是怎么回事?

1, 0, 0, 0, 0// 或 1, 0, 1, 0, 0

其实这道题主要考查两个知识点,一是上面提到的C语言数组初始化,二是C语言语句“序列点”的概念。 (关于“序列点”,可以参考我之前的文章:《虽然这段C语言代码很简单,但很多程序员往往会忽略它隐含的问题》)

这是怎么回事?

这两个结果的原因是 int a[5]={a[2]=1}; C 语言标准没有明确定义(至少在 C99 中)。就这个问题而言,唯一明确的是a[0]会被设置为1,其他的都不会决定结果。

C语言程序员应该对C标准有所了解,这个问题只是一个机会。

首先,有读者质疑 int a[5]={a[2]=1};在 C 语言中是合法的。所以先查查相关标准:数组a是局部变量,因为标准中提到了:

6.7.8 初始化对于具有静态存储持续时间的对象,初始化程序中的所有表达式都应为常量表达式或字符串字面量。

图片[1]-这是C语言数组背后隐藏的基础知识意义吗?(一)-老王博客

表示所有具有静态存储的初始化表达式必须使用常量表达式进行初始化。本题中,数组a初始化为a[2]=1,所以a一定没有静态存储空间,也就是只能是局部变量。

a 必须没有静态存储空间

局部变量a的作用域还包括自己的初始化,所以写成int a[5]={a[2]=1};在C语言中应该是合法的,可以参考标准:

6.2.4 对象的存储持续时间对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行结束

但是,虽然这种写法是合法的,但是上面的C语言代码还是不能确定数组a的结果,标准中也有描述,请看:

6.7.9 初始化初始化列表表达式的求值相对于彼此是不确定的,因此任何副作用发生的顺序都未指定。

一般的想法是初始化列表表达式的计算顺序是不确定的,因此在此期间发生的“副作用”也是不确定的。

为什么这段 C 代码会产生两个结果?

一个简短的总结应该清楚为什么这个 C 代码会产生两个结果。其实C语言的表达方式:

int a[5] = {a[2]=1};相当于 int a[5]={1}; a[2]=1;两个表达式的组合,表达式 int a [5] = {1},这将导致数组 a 中的元素被初始化为

1, 0, 0, 0, 0

而a[2] =1会将数组a的元素2设置为1,最终得到结果

1, 0, 1, 0, 0

但最后会发生什么?不幸的是,根据上面的讨论,两个表达式的副作用的顺序 int a[5]={1}; a[2]=1;生成是不确定的,也就是说,我们不能确定a[2]=1;在int a[5]={1};之前或之后执行,可能会导致两种结果,都不能认为是错误的。

总结

如前所述,“奇怪”的面试题也可以帮助我们填补空白,我们甚至通过了一些 C 标准来解决这个面试题。在此期间,我相信我们的技术在不知不觉中有所进步。

喜欢就离开

欢迎在评论区讨论和提问。这些文章都是手写的和原创的。每天最简单的C语言、linux等嵌入式开发介绍,喜欢我的文章请关注一波,可以看到最新的更新和以前的文章。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论