在最近的一次考試中,我有一個問題沿着如何獲得在C指針工作++的指數?
如果x是指向float的指針,那麼x [5]的類型是什麼或者操作是非法的?
這個問題的正確答案是「浮動」。我測試了以下代碼
float test = 3.3;
float* test2 = &test;
std::cout<< test2[2];
並且看到答案確實是一個浮點數。我很困惑,爲什麼會發生這種情況,並希望得到解釋,因爲我在講義中找不到一個解釋。
在最近的一次考試中,我有一個問題沿着如何獲得在C指針工作++的指數?
如果x是指向float的指針,那麼x [5]的類型是什麼或者操作是非法的?
這個問題的正確答案是「浮動」。我測試了以下代碼
float test = 3.3;
float* test2 = &test;
std::cout<< test2[2];
並且看到答案確實是一個浮點數。我很困惑,爲什麼會發生這種情況,並希望得到解釋,因爲我在講義中找不到一個解釋。
如果x是一個指針指向一個浮子什麼爲x [5]的類型或是操作非法?
正確的答案是:
操作是非法的,所產生的類型將是float
反正。
那次考試的問題是一個非常糟糕的問題。
表達式x[5]
的實際類型對實際操作是否「非法」沒有任何影響,無論如何。
適當的術語是操作是否是未定義的行爲,或者不是。
但是,無論操作是否爲未定義行爲,表達式x[5]
都有一個明確定義的類型,即float
。
要有點挑剔:答案是「表達式的類型x[5]
是浮動的」。無論操作是「非法的」,嚴格意義上不能確定,因爲x
寬鬆的描述僅「漂浮的指針」,可以在幾個不同的方式來解釋。
如果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之前被排序。
未定義的行爲 – Danh
您可以通過讀取未指定的地址來調用未定義的行爲。 –
'test2 [2]'表示與*(test2 + 2)相同' – Oktalist