2013-07-03 48 views
2

你好,我是學習C語言基礎知識,最近我研究過預繳遞增/遞減運營商也關於左值和右值,下面的程序顯示錯誤, 需要左值,根據我應該給一個值,任何人都可以請解釋爲什麼?混淆前置和後置增量運算

int main(){ 
    int x = 8, y; 
    y = --x--; 
    printf("y=%d",y); 
    return 0; 
} 

請解釋一下,爲什麼這樣呢?

+0

如果你投下這個,請好好提一下你的評論,這對我來說似乎非常棘手。 –

+3

它給你的只是未定義的行爲。如果沒有中間順序點,「x」會被修改多次。 –

+0

@AlokSave,你能否更深入地解釋..... –

回答

5

好吧,讓我們看看--x--中發生了什麼。 首先,後遞減執行:--(x--)(x--) = 7。 此操作的該結果後放置到原來的結構: --7 - 沒有任何意義 - 這樣你可以獲得lvalue required錯誤

+1

不是後綴有優先於前綴? – llakais

+1

你是對的。忘了那個:(。將更新一個答案 –

+0

哈哈很酷。我提到它的唯一原因是在C++(我知道這個問題被標記爲C),我認爲'(++ x)++'實際上會工作,因爲在C++前綴運算符返回左值 – llakais

4

聲明y = --x--;會給你編譯如下錯誤Clvalue required。這是因爲後減量運算符 - 在對變量x進行操作後將返回rvalue。因此,沒有左值執行前減量運算符 - 事後。

但是這是CC++不同的一點。在C以下聲明也會給你同樣的錯誤lvalue required

y = (--x)--; 

C++聲明y = (--x)--;將編譯罰款和y值是7。因爲與C不同,C++在對變量x執行前遞減運算符後返回lvalue

+0

+1並且,GCC表示:'error:expression不可賦值,帶下劃線的'x - '。 –

0

C操作順序指定後綴運算符優先於前綴運算符。後綴運算符--返回操作數的當前值(右值),然後遞減操作數。然後應用前綴遞減運算符...但遞減/遞增運算符需要左值操作數,因爲它們通過定義修改它們的操作數。所以,正如編譯器所說的那樣,一個左值是必需的。

2

L Value是賦值運算符的左操作數,它應該指向內存位置。正如@Pavel所解釋的那樣,您的左值正在變成一個值而不是對象,因此您會收到錯誤消息。

--x意味着x = x-1但在你的情況下它變成--7這將等於7 =7-1這絕對是無效的表達式。

除此之外的多個操作對同一個變量沒有任何sequence point之間的結果undefined behaviour

0

你不應該一次使用它,因爲你不會理解編譯器的行爲。所以,你需要引導你的代碼,這樣他們就會被迫做你喜歡的事情。

現在來談談你的觀點。如果你想減少一個值,你可以使用a----a。他們也會這樣做。如果a = 5並且您使用b=a--,則將獲得b = 5 and a = 4,如果使用b=--a,則將在--a中獲得b = 4 and a = 4,該值將立即分配,並且在a--值將在語句完成後分配。希望你清楚。

如果未找到可指定的變量,則會顯示L值所需的錯誤。