C ++编译时表达式作为数组大小

时间:2020-03-06 14:59:40  来源:igfitidea点击:

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

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

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

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

我已经使用Java几年了,因此,如果使用Java友好的单词进行解释,我将不胜感激。

编辑:感谢所有帮助过我的人,Occam的Razor在这里适用。

解决方案

How is that different from int var[3]?

我绝对看不到。

它与" int var [3]"不同。编译器将评估" 2 + 1",并在编译过程中将其替换为" 3"。

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

没什么两样。它是" int var [3]"。

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

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

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

这将创建一个由3个整数组成的数组。没错,无论我们表达为
只要该值是编译时常数,则为" 2 + 1"或者" 3"。

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

零填充仅在使用初始化程序列表时发生。否则,不能保证该数组具有任何特定值。

我已经看过用char数组完成此操作,以强调一个char保留给字符串终止符,但从来没有保留给int数组。

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

int var[];  // illegal
int var[] = {2,1};  // automatically sized to 2
int var[3] = {2,1};  // equivalent to {2,1,0}: anything not specified is zero
int var[3];  // however, with no initializer, nothing is initialized to zero

也许我们正在阅读的代码写的是" 2 + 1"而不是" 3",以提醒我们尾随的" 0"是有意的。