2

我有这两个假定的常数:

int const MATRIX_SIZE = 1000;

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

我正在尝试声明一个数组:

int lrLinkArray [LONGEST_LR_LINK];

我得到错误:

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

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

4

3 回答 3

7

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

int const LONGEST_LR_LINK = MATRIX_SIZE/2;

thenLONGEST_LR_LINK确实是一个常量表达式,并且

int lrLinkArray [LONGEST_LR_LINK];

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

于 2014-07-03T17:37:52.027 回答
3
int const LONGEST_LR_LINK = MATRIX_SIZE/2;

整数除法已经四舍五入。

于 2014-07-03T17:38:06.890 回答
2

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

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

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

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

于 2014-07-03T17:41:56.980 回答