2017-08-09 105 views
-7
int arr[5]; 

    arr++;               
    arr+4;     //compile with only this 
    printf("%u", arr); 

爲什麼C語言編譯器不能與arr++說:「需要左值」,但也 成功地與arr+4編譯編譯? arr++表示法的左值概念是什麼?解讀左值和右值與符號ARR + 4和改編++

+2

'arr'最終是不是左值(因爲它衰變的結果),並且您只能在左值上使用修改增量運算符。加法沒有這樣的限制(例如,說'1 + 1'是有效的)。 –

+1

發佈其他人可以編譯和測試的整個程序。 – Hannebambel

+0

[是數組名稱的指針嗎?](https://stackoverflow.com/questions/1641957/is-an-array-name-a-pointer) –

回答

3

當您使用arr時,它當然可以將衰減指向其第一個元素,即它相當於&arr[0]

當你做arr++你試圖修改這個指針(有效地做arr = arr + 1)。這是不可能的,因爲數組的位置是固定的並且不能被修改。

With arr + 4你在做指針算術。在這裏,您將4添加到腐爛的指針,但您不嘗試修改指針本身。事實上,這相當於&arr[4]


您顯示的代碼還有一個小問題。我說小但我的意思是

隨着

printf("%u", arr); 

你讓數組衰變爲指針。然後嘗試使用"%u"格式說明符打印此指針。 格式說明符是打印int,而不是指針。不匹配的格式說明符和參數類型導致未定義的行爲

要品脫您需要使用"%p"格式的通用(void *)指針,投指針void *

printf("%p", (void *) arr); 
+1

實際上'arr + 4;'什麼都不做。是句法正確的,但它是一個沒有效果的語句,只會被忽略 –

+0

謝謝。我明白了。很好的解釋。 –