2015-07-03 35 views
4

我想了解在使用浮點值對數組進行索引時會發生什麼。C++ - 當您通過浮點數組索引數據會發生什麼?

此鏈接: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循環。

我在這裏節約了大量的代碼,因爲我想盡可能多的這個問題的解決我自己的地。但我想知道是否有這種情況,你是否想要像這樣迭代數組。

必須有比浮動只是自動轉換成一整型更多的東西。這裏還有更多的事情要做。

+1

A [數字轉換(http://en.cppreference.com/w/cpp/language/implicit_cast#Numeric_conversions)發生,從浮點型到整型。 –

+1

不是'int/16'仍然是'int',而不是'float'。 – Jarod42

+0

@JoachimPileborg發生編譯錯誤 –

回答

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)xy「半開」間隔:那就是,它包含xy之間的每一個數字,而且它包括x但不包括y

+0

謝謝,這很有道理。顯然,我正在以比實際更難的方式來看待問題,並且由於過度思考而忽略了初學者的東西。 –

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 
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節 - 添加劑運營商我們讀到:

(...) 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

所以,當你索引通過浮法陣列你得到一個編譯錯誤

相關問題