将数组的大小设置为从另一个常量的除法派生的常量值

Setting an array's size to the value of a const derived from the division of another constant

本文关键字:常量 另一个 除法 派生 数组 设置      更新时间:2023-10-16

我有两个假定的常数:

int const MATRIX_SIZE = 1000;
int const LONGEST_LR_LINK = (int)floor(MATRIX_SIZE/2);

我正试图声明一个数组:

int lrLinkArray [LONGEST_LR_LINK];

我得到错误:

错误:数组绑定不是']'标记之前的整数常量

手动插入LONGEST_LR_LINK的一半MIX_SIZE不会有太大麻烦,但我很好奇这个问题的解决方案是什么。对常量进行任何类型的计算都是不好的做法吗?

C++中的整数除法会自动向下取整。所以如果你有的定义

int const LONGEST_LR_LINK = MATRIX_SIZE/2;

那么LONGEST_LR_LINK将确实是一个常数表达式,并且

int lrLinkArray [LONGEST_LR_LINK];

应该没事。此外,无论如何,floor(MATRIX_SIZE/2)不会做你认为它会做的事情;为了强制进行非整数除法,您必须编写floor(MATRIX_SIZE/2.0)

int const LONGEST_LR_LINK = MATRIX_SIZE/2;

整数除法已经四舍五入。

整数除法应该做你想做的事,我们可以从C++标准草案中看到,在5.6乘法运算符一节中,它说:

[…]对于整数操作数,/运算符产生代数商丢弃任何小数部分81[…]

要理解为什么不这样做,您必须意识到,即使使用使其成为常量表达式的文字来初始化MATRIX_SIZE std::floor也不是constexpr函数,因此LONGEST_LR_LINK也不是常量表达式,不能用于需要积分常量表达式的数组边界。

此外,据我所知,常量表达式中也不允许使用旧式C类型转换。

相关文章: