C++ - 当您用浮点数索引数组时会发生什么?

C++ - What happens when you index an array by a float?

我正在尝试了解在对具有浮点值的数组进行索引时会发生什么。

这个link:Float Values as an index in an Array in C++

没有回答我的问题,因为它指出浮点数应四舍五入为整数。然而,在我试图评估的代码中,这个答案没有意义,因为索引值只会是 0 或 1。

我正在尝试解决任天堂发布的编码挑战。为了解决这个问题,有一个古老的语句,它使用一个长而复杂的按位表达式对数组进行按位赋值。

数组声明为指针

unsigned int* b = new unsigned int[size / 16]; // <- output tab

然后为每个元素分配 0

for (int i = 0; i < size / 16; i++) {   // Write size / 16 zeros to b
    b[i] = 0;
}

这是声明的开头。

b[(i + j) / 32] ^= // some crazy bitwise expression

上面的内容位于嵌套的 for 循环中。

我在这里省去了很多代码,因为我想尽可能多地自己解决这个问题。但我想知道是否有一种情况是您想要遍历这样的数组。

它肯定不仅仅是自动转换为 int 的浮点数。这里必须进行更多操作。

这里没有 floatsize是整数,16是整数,所以size/16也是整数。

整数除法向零舍入,因此如果 size[0,16) 中,则 size/16 == 0。如果 size[16,32) 中,则 size/16 == 1,依此类推。如果 size(-16, 0] 中,那么 size / 16 == 0 也是。

([x,y)是从xy的"half-open"区间:即包含了x到[=25=之间的每一个数], 而且它包括 x 但不包括 y)

回答标题中的问题:

#include <stdio.h>
int main(int argc, char** argv) {
  int x[5];

  int i;
  for (i = 0; i < 5; ++i)
    x[i] = i;


  x[2.5] = 10;

  for (i = 0; i < 5; ++i)
    printf("%d\n", x[i]);
}

如果我用 gcc 编译它,我会得到一个编译器错误:

foo.c:10: error: array subscript is not an integer

数组中的下标运算符是语法糖。当你有以下条件时:

class A {...}; 
A ar[17]; 
std::cout << ar[3] << std::endl;

ar[3] 与说:

没什么不同
*(ar + 3); 

所以 ar[3.4] 等同于说

*(ar + 3.4)    (1)

从 C++ 标准第 5.7.1 节 - 加法运算符 我们读到:

(...) For addition, either both operands shall have arithmetic or unscoped enumeration type, or one operand shall be a pointer to a completely-defined object type and the other shall have integral or unscoped enumeration type.

这就是表达式 (1) 导致 compilation error 的原因。

所以,当你用浮点数索引一个数组时,你会得到一个编译错误