zoukankan      html  css  js  c++  java
  • C 语言面试题 — int i [ 4 ]={ i [ 2 ]=2 }

    目录

    文章目录

    题目

    #include <stdio.h>
    
    int main(void) {
        int i[4] = {i[2] = 2};
        printf("%d %d %d %d
    ", 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(边缘影响)谁先谁后的问题。

    1. i[2]=2 先执行,则 i[0]=2,i[1]=0,再执行 i[4]={i[2]=2},即:i[4]={2,0}。因为一维数组不完全初始化(Partly initialized)规则,K&R C 中是这样阐述的:如果初始化表达式的个数比数组元素数少,则对外部变量,静态变量和自动变量来说,没有初始化表达式的元素将被初始化为 0。所以结果为 i[0]=2,i[1]=0,i[2]=2,i[3]=0

    2. i[4]={} 先执行,就相当于对数组赋值的时候是对 i[2] 专门赋值了,就是数组的第三个成员赋值成 2,其他都初始化为 0。结果为 i[0]=0,i[1]=0,i[2]=2,i[3]=0

    因此根据它们产生的先后就会有两种结果。

    [root@c-dev ~]# gcc -g -std=c99 -Wall test.c -o test
    [root@c-dev ~]# ./test
    2 0 2 0

    相关阅读:

  • 相关阅读:
    stack 栈
    链表
    2018.09.08 DL24 Day1 总结
    10.07 WZZX Day2总结
    10.06 WZZX Day1总结
    Joseph问题 (线段树)
    [POI2006]TET-Tetris 3D
    10.05FZSZ Day2模拟总结
    Tarjan求LCA
    数据结构
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309278.html
Copyright © 2011-2022 走看看