C ++ - 用float索引数组时会发生什么?

时间:2015-07-03 19:09:43

标签: c++ arrays indexing

我试图准确理解在使用float值索引数组时会发生什么。

此链接: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更多。这里有更多的事情要发生。

3 个答案:

答案 0 :(得分:8)

这里没有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的&#34;半开&#34;间隔:也就是说,它包含x和{之间的每个数字{1}},此外它包含y但不包括x

答案 1 :(得分:3)

数组方面的下标运算符是语法糖。如果您有以下内容:

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节 - 添加运算符,我们读到:

  

(...)另外,两个操作数都应具有算术或非范围的枚举类型,或一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或无范围的枚举类型。

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

因此,当您通过浮点索引数组时会出现编译错误

答案 2 :(得分:2)

回答标题中的问题:

#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