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 的浮点数。这里必须进行更多操作。
这里没有 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
的"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 的原因。
所以,当你用浮点数索引一个数组时,你会得到一个编译错误
我正在尝试了解在对具有浮点值的数组进行索引时会发生什么。
这个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 的浮点数。这里必须进行更多操作。
这里没有 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
的"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 的原因。
所以,当你用浮点数索引一个数组时,你会得到一个编译错误