C 语言面试题 — int i [ 4 ]={ i [ 2 ]=2 }

僤鯓⒐⒋嵵緔 提交于 2020-05-05 13:02:46

目录

文章目录

题目

#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}; 写法具有双重初始化的顺序问题,即 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.。也就是说初始化表达式计算顺序不确定!

到这里就很清晰了,无非就是 i[2]=2int i[4]={2} 产生的 side effects(边缘影响)谁先谁后的问题。但是有一点我们要明确:无论谁先谁后,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。因此根据它们产生的先后就会有两种结果。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!