c/c++语言开发共享数组初始化中数组元素的赋值

考虑以下简单程序:

#include  int main(void) { int a[5] = { a[2] = 1 }; printf("%d %d %d %d %dn", a[0], a[1],a[2], a[3], a[4]); } 

使用GCC 7.3.0输出

  1 0 1 0 0 

考虑到a[1]为零,似乎初始化类似于

 int a[5] = { 1 }; a[2] = 1; 

问题是:虽然初始化程序可以是任何通用表达式,其初始化和赋值顺序是什么?

这甚至是有效且定义明确的吗? 可能是实现定义,未定义或未指定?


这个问题与C中关于数组初始化的混淆问题有关 。

    虽然我不能说,我是ISO专家,这是我在godbolt的帮助下发现的 。

    首先,我在-fsanitize=undefined的帮助下构建了样本,这给出了未定义行为的良好指示。 海湾合作委员会和铿锵声都没有抱怨。

    接下来我看了gcc执行的各个阶段,在这个例子中是gimple阶段

     foo () { int a[5]; try { # DEBUG BEGIN_STMT a = {}; a[2] = 1; _1 = a[2]; a[0] = _1; # DEBUG BEGIN_STMT _2 = a[4]; _3 = a[3]; _4 = a[2]; _5 = a[1]; _6 = a[0]; printf ("%d %d %d %d %dn", _6, _5, _4, _3, _2); } finally { a = {CLOBBER}; } } 

    在这里你可以看到,首先定义了数组a ,然后将1分配给a[2] ,之后结果( 1 ,因为它是赋值 )被分配给a的第一个元素。 索引中的另一个保留为0,因此打印出模式1 0 1 0 0

    需要了解更多c/c++开发分享数组初始化中数组元素的赋值,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享数组初始化中数组元素的赋值相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979728.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐