在C中声明数组时,是否存在以下区别:

int someNumbersArray[] = {10, 20, 30};

以及:

int someNumbersArray[3] = {10, 20, 30};

I suppose that the result is the same after compilation. Maybe the latter is slightly faster during compilation?

我用一个由10000个数字组成的数组try 了上面的代码,没有看到任何区别.

PS:

  • 声明大小太小的数组会导致问题(如果是这样,我使用的编译器会显示警告).
  • 我知道您可以声明一个带有值的数组,并赋予它更大的大小;在这种情况下,显然您实际上必须声明所需的大小.

推荐答案

在C中声明数组时,[...]

第二种情况下的显式数组维度等于初始值设定项中的元素数,因此在所给出的两个备选方案之间没有semantic个差异.它们对C来说也意味着同样的事情.

也许后者在编译过程中稍微快一些?

也许吧,但您不太可能注意到其中的差异,即使是对于大量的元素和/或许多这样的array.编译速度对于C语言来说很少是问题(与C++相反),所以这不是C程序员经常考虑的问题.

因此,剩下的是围绕代码清晰度和可维护性、开发过程等方面的考虑.例如,

  • 当特定数量的元素对程序的语义很重要时,例如对于3D空间中的一个向量,显式声明大小有助于向其他人和编译器传达恰好需要该数量的元素.这可以帮助人们和编译器捕捉错误,并为其他开发人员提供有关数组用途的线索.

  • 另一方面,如果数组大小的重要性仅仅在于它对于呈现的任何元素都足够,那么省略显式大小往往意味着这一点.在这种情况下,省略大小也有助于程序员避免错误,它更容易编写,并且在向初始化器添加元素或从初始化器中移除元素时更容易维护.

    这方面的规范用例可能是声明一个数组来保存通过字符串文字初始化的字符串.人们忘记为字符串终止符声明足够的空间是一个相当常见的错误.

C++相关问答推荐

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

为什么输出不是从上到下C

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

在传统操作系统上可以在虚拟0x0写入吗?

我可以在C中声明不同长度数组的数组而不带变量名吗?

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

使用双指针动态分配和初始化2D数组

这个计算C中阶乘的函数正确吗?

如何在POSIX-UEFI中获得输入?

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

Tic-tac-toe:从文件加载存储

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

为四维数组中的Dim-1和Dim-3重新分配空间

为什么我在C代码中得到一个不完整的类型?

生产者消费者计数器意外输出的C代码

为什么我无法访问C语言中的文件

如何在C宏定义中包含双引号?

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

当循环变量在溢出时未定义时,可以进行哪些优化?