簡體   English   中英

C ++ - 用float索引數組時會發生什么?

[英]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)是從xy的“半開”間隔:也就是說,它包含xy之間的每個數字,而且它包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM