【问题标题】:C++ compile-time expression as an array sizeC++ 编译时表达式作为数组大小
【发布时间】:2010-09-14 15:10:37
【问题描述】:

我不确定该术语是否实际上是“数组加法”。

我试图了解以下行的作用:

int var[2 + 1] = {2, 1};

这与int var[3] 有何不同?

我已经使用 Java 好几年了,如果能用 Java 友好的词语解释一下,我将不胜感激。

编辑:非常感谢所有帮助过我的人,奥卡姆剃刀法则在这里适用。

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    没有什么不同。 C++ 允许在数组声明的下标中使用表达式(甚至是非常量表达式)(有一些限制;除了多维数组的初始下标之外的任何内容都必须是常量)。

    int var[]; // 非法的
    int var[] = {2,1}; // 自动调整为 2
    int var[3] = {2,1}; // 等价于 {2,1,0}:任何未指定的都为零
    整数变量[3]; // 然而,没有初始化器,没有任何东西被初始化为零

    也许您正在阅读的代码写入 2 + 1 而不是 3,以提醒您后面的 0 是故意的。

    【讨论】:

    • 作为附录,char var[]="1234" 将赋予 var 5 的大小,因为字符串文字包含尾随的 NUL 字符。如果需要,可以指定 char var[]={'1','2','3','4'} 或 char var[4]="1234" 来克服这个问题。
    • int var[];将被允许​​作为外部声明 - 肯定是在 C 中,我也相信 C++。不是特别好的风格 - 应该在标题等 - 但允许在函数/类等之外。
    • 是的。我在考虑函数定义中的堆栈变量:裸露的“int var[]”在那里是非法的,但在许多其他情况下是允许的,例如参数和外部声明。
    【解决方案2】:

    它与int var[3] 有任何不同。编译器将评估2 + 1 并在编译期间将其替换为3。

    【讨论】:

    • 其余的将默认初始化。
    • 真的吗?那么 int 的默认值是什么? 0?
    • 对于 POD 类型,任何 mssing 元素都将填充为 0。
    • 是的,0 是 int 的默认值。来自标准:“如果列表中的初始化程序少于聚合中的成员,则每个未显式初始化的成员都应默认初始化。”
    【解决方案3】:

    这与int var[3] 有何不同?

    我看不到。

    【讨论】:

      【解决方案4】:

      没有什么不同;是int var[3]。

      在编写char 数组时,有人可能会这样写他们的数组,以便为​​终止的0 添加空间。

      char four[4 + 1] = "1234";  
      

      使用int 数组似乎没有任何意义。

      【讨论】:

        【解决方案5】:

        var[2 + 1] 与var[3] 没有区别。作者可能想强调 var 数组将包含 2 个数据项和一个终止零。

        【讨论】:

          【解决方案6】:

          这将创建一个由 3 个整数组成的数组。你说得对,表达为
          2 + 1或3没有区别,只要值是编译时常数即可。

          = 的右侧是一个初始化列表,它告诉编译器如何填充数组。第一个值是2,第二个是1,第三个是0,因为没有指定更多值。

          零填充仅在您使用初始化列表时发生。否则无法保证该数组具有任何特定值。

          我已经看到使用 char 数组完成此操作,以强调一个 char 是为字符串终止符保留的,但绝不是为 int 数组保留的。

          【讨论】:

            猜你喜欢
            • 2019-10-22
            • 1970-01-01
            • 2011-05-19
            • 2022-01-12
            • 2013-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多