我试图准确理解在使用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更多。这里有更多的事情要发生。
答案 0 :(得分:8)
这里没有float
。 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
的&#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