2017-10-20 163 views
4

這些表達式的結果是否相同?指針算術 - 相同的表達式?

&(*ptr) += 4 // Expression 1 
ptr += 4 // Expression 2 

我主要是一個Java開發人員,並且已經被分派重新編譯從VS2008到VS2015的舊項目。上面的第一行導致編譯錯誤,因爲左操作數不是可修改的l值。問題是如果我可以使用第二個表達式而不是第一個表達式,因爲根據我的理解,它們應該是相同的?

該ptr類型爲char*

非常感謝任何有關此問題的見解和/或幫助。

+0

那麼,你是說在VS2008下的第一個_did_編譯?如果是這樣,編譯器正在做一些非標準的事情,並不清楚它是否實際上改變了'ptr'的值,或者改變了臨時指針的值並拋出了這個結果。我建議謹慎。 –

+0

它的確做到了。我發現它也很麻煩,現在知道編譯器無法訪問第一個表達式。害怕我會糾正一直在「破碎」的東西。 – Sarynn

+3

第一個是荒謬的,老實說,我不知道重點會是什麼,我認爲我們需要更多的背景。它們不會完全相同,因爲編譯器說第一次嘗試修改一個臨時地址,如果它編譯它可能對'ptr'沒有任何影響,但是您可以始終使用舊編譯器並親自查看。 – George

回答

1

&返回左值的地址,但本身不可修改,所以(&a)++沒有意義,因爲您不能指定爲&a。所以第一個表達式不是定義的操作。 (因此,左操作數的錯誤不是可修改的左值)。另外&(*ptr) = ptr因爲您正在取消引用一個指針,然後抓取地址,而&(*ptr)是一個有效的語法構造,它是非常沒有意義的。第二條語句將指針移動到4個內存地址上。

所以沒有聲明是不一樣的。

編輯: 有趣的是,它編譯VS2008。編譯器必須將&定義爲一個可修改的值(實質上只是創建一個指向該地址的指針)。這可能只是編譯器中的一個錯誤。如果您需要將代碼轉換爲語法上的正確,那麼第二個表達式應該會很好。假設你想要修改ptr的最終結果。 (自從聲明使用+ =以來,我覺得那是想要的語義)。