2016-12-01 118 views
1

在最近的一次考試中,我有一個問題沿着如何獲得在C指針工作++的指數?

如果x是指向float的指針,那麼x [5]的類型是什麼或者操作是非法的?

這個問題的正確答案是「浮動」。我測試了以下代碼

float test = 3.3; 
float* test2 = &test; 
std::cout<< test2[2]; 

並且看到答案確實是一個浮點數。我很困惑,爲什麼會發生這種情況,並希望得到解釋,因爲我在講義中找不到一個解釋。

+4

未定義的行爲 – Danh

+3

您可以通過讀取未指定的地址來調用未定義的行爲。 –

+2

'test2 [2]'表示與*(test2 + 2)相同' – Oktalist

回答

3

如果x是一個指針指向一個浮子什麼爲x [5]的類型或是操作非法?

正確的答案是:

操作是非法的,所產生的類型將是float反正。

2

那次考試的問題是一個非常糟糕的問題。

表達式x[5]的實際類型對實際操作是否「非法」沒有任何影響,無論如何。

適當的術語是操作是否是未定義的行爲,或者不是。

但是,無論操作是否爲未定義行爲,表達式x[5]都有一個明確定義的類型,即float

要有點挑剔:答案是「表達式的類型x[5]是浮動的」。無論操作是「非法的」,嚴格意義上不能確定,因爲x寬鬆的描述僅「漂浮的指針」,可以在幾個不同的方式來解釋。

2

如果x是指向float的指針x [5]的類型是什麼或者操作是非法的?

  • 如果沒有別的設置,的x[5]操作是非法的,的x[5]類型仍是良好定義float

  • 如果x實際上是指向浮子的陣列的元件,鑑於有是該陣列中該元素後超過5個以上的元素,x[5]是合法的。 e.g:

    float a[10] = { 0.0 }; 
    float *x = a; 
    x[5] = 1.0; // legal 
    x = a + 4; // x point to the 5th element of a 
    x[5] = 0; // legal 
    x = a + 5; 
    x[5] = 0; // illegal 
    float t = 0; 
    x = &t; x[5] = 0; // illegal 
    

在所有上述實例中,x[5]類型是公定義爲浮動。由於[expr.sub](強調是我的):

一個後綴表達式後跟一個表達式放在方括號中是一個後綴表達式。一個表達式的類型應該是的glvalue「陣列T的」或類型「指針T」一個prvalue和其他應無作用域枚舉或整體型的prvalue。結果是「T」型。類型「T」應當是完全定義的對象type.66 表達E1 [E2]是相同的(根據定義)爲*((E1)+(E2)) [注:參見[expr.unary]和[expr.add]獲取*和+和[dcl.array]的詳細信息。 - 結束註釋],除了在數組操作數的情況下,如果該操作數是左值,則結果是左值,否則結果是左值。表達式E1在表達式E2之前被排序。