2011-01-26 38 views
26

在C++中,預增值運算符會給出左值,因爲返回的是增量對象本身,而不是副本。 但在C中,它給出了右值。爲什麼?爲什麼預增加運算符在C中給出右值?

+1

它是一個很好的問題恕我直言:-) –

+0

http://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not –

+1

@Jason:那問題是特定於C++ –

回答

15

C沒有引用。在C++ ++i中返回對i(左值)的引用,而在C中它返回一個副本(增加)。

C99 6.5.3.1/2

預音響X ++運算符的操作數的值被遞增。 結果是增量後的操作數的新值。表達式++ Eis相當於(E + = 1)。

‘‘value of an expression’’ <=> rvalue

但是由於歷史的原因,我認爲「引用不存在的C部分」可能是一個可能的原因。

+0

但我仍然不明白爲什麼它會在預增加時返回一個副本。爲什麼不像我說的那樣返回遞增i = j。 在這裏,原始的i在被改變後被返回。同樣,在i = i + 1中,我本身可以在更改後返回。 –

+1

@HappyMittal:表達式並不真正返回值,它們具有值(或計算爲值)以及其他屬性,如類型和_lvalue-ness_,表達式「++ i」不會「返回」副本,那裏沒有副本。 '++ i'評估爲'i'的新值。沒有副本,除非您使用更大的表達式進行復制。 –

+0

@Charles Bailey:好的,我同意在++中評估i的新值。但我的問題是,在i = j中,我改變了,表達式產生了一個左值。因此,++即i = i + 1與i = j幾乎相同,那麼爲什麼在這種情況下,表達式不會產生左值? –

2

關於我的頭頂,我無法想象使用預先增加的變量作爲左值可能導致的任何有用的語句。在C++中,由於運算符重載的存在,我可以。由於這個限制,你有沒有一個特定的例子可以阻止你在C中進行操作?

+2

這應該是一條評論。 –

+0

@Jason..yes。我不能在C - int * ptr =&++中做到這一點我是 –

+1

@Filip這是我提出的問題的答案(公認是非嚴格的)。在C++中增加了重載運算符使前增值作爲左值構造更有價值,因此增加了它。 –

2

C99說,在腳註(第6.3.2.1 $),

名稱 '' 左值'從賦值表達式E1 = E2 ,其中左操作數E1是 談到最初 必須是(可修改的)左值。 它可能更好地被認爲是 代表一個對象的'定位器 值''。 有時被稱爲 的「右值」在此國際 標準中被描述爲 的值「」的值。

希望解釋爲什麼在C中的++i返回右值。


至於C++,我會說它取決於被遞增的對象。如果對象的類型是某種用戶定義的類型,那麼它可能總是返回左值。這意味着,你可以寫i++++++++++++++i如果i類型Index如下定義:

Undefined behavior and sequence points reloaded

+0

如果對象的類型不是用戶定義類型,那麼預增量必須是_lvalue_,無論如何。 –

+0

我在C中詢問行爲,因爲在C++中,返回左值是有意義的,因爲遞增對象將被返回。 –

+1

@Charles:呵呵..是的。由於OP沒有提及對象的類型,我只回答了問題的一個方面。 – Nawaz