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

举报
云物互联 发表于 2021/08/05 23:29:58 2021/08/05
【摘要】 目录 文章目录 目录题目 题目 #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; } 1234567 本题考察的是 Sequence Point(序列点...

目录

文章目录

题目

#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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

本题考察的是 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

  
 
  • 1
  • 2
  • 3

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/105925068

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。