C++ - 当你用浮点数作为数组下标时会发生什么?

4
我试图理解通过浮点数值索引数组时会发生什么。这个链接:Float Values as an index in an Array in C++并没有回答我的问题,因为它指出浮点数应该舍入为整数。然而,在我正在评估的代码中,这个答案并没有意义,因为索引值只可能是0或1。
我试图解决Nintendo发布的编程挑战。为了解决问题,有一个古老的语句使用一个长而复杂的位运算表达式将位赋值到一个数组中。该数组被声明为指针: 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] ^= // 一些疯狂的位运算表达式

上述代码块位于嵌套的for循环中。

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

肯定不只是浮点数自动转换为整数。这里肯定涉及到更多的内容。


1
发生了一次数字转换,从浮点类型到整数类型。 - Some programmer dude
1
请注意,int / 16仍然是一个int,而不是一个float - Jarod42
@JoachimPileborg 发生了编译错误。 - Nikos Athanasiou
@Jarod42,您不能使用一个不是整数或未作用域枚举类型的操作数进行下标运算中涉及的指针算术运算。 - Nikos Athanasiou
你会被解雇或者得到最低的不及格分数。 - Martin James
3个回答

8
这里没有浮点数。size是一个整数,16也是一个整数,因此size/16也是一个整数。
整数除法向零取整,因此如果size在[0,16)范围内,则size/16等于0。如果size在[16,32)范围内,则size/16等于1,以此类推。如果size在(-16,0]范围内,则size/16也等于0。
([x,y)是“半开”区间从x到y:即它包含x和y之间的每个数字,并且还包括x但不包括y)

谢谢,这很清晰易懂。显然我把问题看得比它实际上更难,由于过度思考而错过了初学者的东西。 - Dan Fletcher

4
在数组中,下标运算符是一种语法糖。当你有以下内容时:
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)会导致编译错误

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


3
回答标题中的问题:

#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接