查看原文
其他

int i [ 4 ]={ i [ 2 ]=2 },神操作???

薛定谔的coding猫 IT服务圈儿 2022-09-11

IT服务圈儿

有温度、有态度的IT自媒体平台


本文经公众号:C语言编程(ID:cyuyanbiancheng)授权转载,如需转载请联系出处


各位,看见标题的这种写法是不是感觉有点奇怪?别急,今天给大家带来是Stackoverflow上的一个面试题,据说是美国福特公司嵌入式开发岗位的,这个真假我们就不深究了,我们需要关注的是题目本身,题目如下:


#include<stdio.h>int main(void){    int i[4]={i[2]=2};    printf("%d %d %d %d\n",i[0],i[1],i[2],i[3]);    return 0;}


代码很简单,问会输出什么结果?


乍一看考察的是数组的初始化,真的是这样吗?答案是否定的,且不说答案对错,你想会这么简单吗?其实本题真正想考察的是sequence point的问题,也就是我们常说的“序列点”,当然也涉及了一些数组初始化的问题。下面我们开始分析:


让我们来看int i[4]={i[2]=2}这行代码,看似有些奇怪,实际上在C99标准中关于这种写法是没有明确规定的,但是这么写是合法的。上述写法就是双重初始化(其实i[2]=2也可说是赋值)的顺序问题,即int i[4]={2}和i[2]=2谁先执行。


关于这一点,C标准是这样阐述的:The evaluations of the initialization list expressions are indeterminately sequenced with respect to one another and thus the order in which any side effects occur is unspecified。也就是说初始化表达式计算顺序不确定!句中side effects直译是“边缘影响”,指的是我们经常说的“副作用”,同时期间产生的"副作用"也不确定!


到这里就很清晰了,无非就是i[2]=2和int i[4]={2}产生的副作用谁先谁后的问题。但是有一点我们要明确:无论谁先谁后,i[0]=2这一点可以肯定,因为一维数组不完全初始化(partly initialized)规则,K&R C 中是这样阐述的“ 如果初始化表达式的个数比数组元素数少,则对外部变量,静态变量和自动变量来说,没有初始化表达式的元素将被初始化为0。


int i[4]={2}产生的副作用是将数组初始化为"2,0,0,0",i[2]=2产生的副作用是将数组的第三个元素设置为2,因此根据它们产生的先后就会有两种结果:2,0,2,0和2,0,0,0。这就是本题的答案,你明白了吗?




*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存