在C++中,預增值運算符會給出左值,因爲返回的是增量對象本身,而不是副本。 但在C中,它給出了右值。爲什麼?爲什麼預增加運算符在C中給出右值?
回答
C沒有引用。在C++ ++i
中返回對i
(左值)的引用,而在C中它返回一個副本(增加)。
C99 6.5.3.1/2
預音響X ++運算符的操作數的值被遞增。 結果是增量後的操作數的新值。表達式++ Eis相當於(E + = 1)。
‘‘value of an expression’’ <=> rvalue
但是由於歷史的原因,我認爲「引用不存在的C部分」可能是一個可能的原因。
但我仍然不明白爲什麼它會在預增加時返回一個副本。爲什麼不像我說的那樣返回遞增i = j。 在這裏,原始的i在被改變後被返回。同樣,在i = i + 1中,我本身可以在更改後返回。 –
@HappyMittal:表達式並不真正返回值,它們具有值(或計算爲值)以及其他屬性,如類型和_lvalue-ness_,表達式「++ i」不會「返回」副本,那裏沒有副本。 '++ i'評估爲'i'的新值。沒有副本,除非您使用更大的表達式進行復制。 –
@Charles Bailey:好的,我同意在++中評估i的新值。但我的問題是,在i = j中,我改變了,表達式產生了一個左值。因此,++即i = i + 1與i = j幾乎相同,那麼爲什麼在這種情況下,表達式不會產生左值? –
關於我的頭頂,我無法想象使用預先增加的變量作爲左值可能導致的任何有用的語句。在C++中,由於運算符重載的存在,我可以。由於這個限制,你有沒有一個特定的例子可以阻止你在C中進行操作?
這應該是一條評論。 –
@Jason..yes。我不能在C - int * ptr =&++中做到這一點我是 –
@Filip這是我提出的問題的答案(公認是非嚴格的)。在C++中增加了重載運算符使前增值作爲左值構造更有價值,因此增加了它。 –
C99說,在腳註(第6.3.2.1 $),
名稱 '' 左值'從賦值表達式E1 = E2 ,其中左操作數E1是 談到最初 必須是(可修改的)左值。 它可能更好地被認爲是 代表一個對象的'定位器 值''。 有時被稱爲 的「右值」在此國際 標準中被描述爲 的值「」的值。
希望解釋爲什麼在C中的++i
返回右值。
至於C++,我會說它取決於被遞增的對象。如果對象的類型是某種用戶定義的類型,那麼它可能總是返回左值。這意味着,你可以寫i++++++++
或++++++i
如果i
類型Index
如下定義:
如果對象的類型不是用戶定義類型,那麼預增量必須是_lvalue_,無論如何。 –
我在C中詢問行爲,因爲在C++中,返回左值是有意義的,因爲遞增對象將被返回。 –
@Charles:呵呵..是的。由於OP沒有提及對象的類型,我只回答了問題的一個方面。 – Nawaz
- 1. 預增加運算符
- 2. C#遞增運算符(++)問題:爲什麼我輸出錯誤?
- 3. C++增加運算符
- 4. 在條件運算符中增加運算符c
- 5. 爲什麼不能在賦值運算符中增加一個變量?
- 6. 爲什麼Ada中沒有(增強賦值)運算符,如+ =, - =或++?
- 7. 運算符分配預增值
- 8. 爲什麼條件運算符沒有給出預期的結果(使用Python)?
- 9. 爲什麼++運算符將整數增加4而不是1?
- 10. 「| =」運算符在C#中做什麼?
- 11. 「| =」運算符在C#中表示什麼?
- 12. **運算符在C中表示什麼?
- 13. 「| =」運算符在C中表示什麼?
- 14. - >運算符在C中做什麼?
- 15. #和##運算符在C中做什麼?
- 16. C++ - 什麼是運算符。*?
- 17. 後增值運算符的內部運作是什麼?
- 18. 爲什麼沒有賦值的三元運算符返回預期的輸出?
- 19. 對多個值增加運算符
- 20. 爲什麼javascript ++運算符在我的代碼中增加了多個步驟?
- 21. 爲什麼在C/C++中沒有|| =運算符?
- 22. 爲什麼C++將賦值(=)視爲重載運算符?
- 23. 爲什麼添加運算符會添加散列鍵值對?
- 24. 爲什麼我的算法沒有給出預期的輸出?
- 25. C增量運算符
- 26. C++遞增運算符
- 27. 爲什麼`:=`作爲中綴運算符?
- 28. 爲什麼在scala中使用'〜'運算符會給我一個負值
- 29. C中的'#'運算符是什麼?
- 30. 什麼是C++中的static_case運算符?
它是一個很好的問題恕我直言:-) –
http://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not –
@Jason:那問題是特定於C++ –