[英]C++ - What happens when you index an array by a float?
我試圖准確理解在使用float值索引數組時會發生什么。
此鏈接: Float Values作為C ++中Array的索引
不回答我的問題,因為它聲明浮點數應舍入為整數。 但是在我試圖評估的代碼中,這個答案沒有意義,因為索引值只能是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
也是整數。
整數除法向零[0,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
)
數組中的下標運算符是語法糖。 如果您有以下內容:
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)導致編譯錯誤的原因。
因此,當您通過浮點索引數組時,您會收到編譯錯誤
要回答標題中的問題:
#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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.