2013-01-21 33 views
0

this post(而不僅僅是)我們得到了++操作符不能應用於返回值的表達式的問題。 顯而易見,5 ++最好寫成5 + 1.我只想總結一下增量/減量運算符的全部內容。所以,讓我們來看看這些代碼片段,這些代碼可能對至少第一次在++中卡住的人有幫助。通過一個值而不是一個變量,屬性和索引器來限制post/pre increment操作符

// Literal 
int x = 0++; // Error 

// Constant 
const int Y = 1; 
double f = Y++; // error. makes sense, constants are not variables actually. 

int z = AddFoo()++; // Error 

摘要:++適用於變量,屬性(通過合成糖)和索引器(相同)。
現在關心部位 - 任何文字表述在CSC優化,因此,當我們在寫,說

int g = 5 + 1; // This is compiled to 6 in IL as one could expect. 
IL_0001: ldc.i4.6 // Pushes the integer value of 6 onto the evaluation stack as an int32. 

對於5 ++並不意味着5變爲6,它可能是5 + 1的簡寫,就像x ++ = x + 1 這個限制背後的真正原因是什麼?

int p = Foo()++ //? yes you increase the return value of Foo() with 1, what's wrong with that? 

讚賞可能導致邏輯問題的代碼示例。

現實生活中的一個例子可能是,執行一個比數組更多的操作。

for (int i = 0; i < GetCount()++; i++) { } 

也許缺少使用opts編譯器團隊來避免類似的功能? 我不堅持認爲這是我們缺乏的一個特性,只是想了解編譯器編寫者的這個黑暗面,儘管我不是。但我知道c++ allows this when returning a reference in the method。我既不是C++的人(非常貧窮的知識),也只是想獲得限制的真正主旨。 像,是不是因爲c#的人選擇限制超過值表達式的++或有明確的情況下導致不可預知的結果?

回答

2

爲了使功能值得支持,它的確需要有用。你所提出的代碼在每種情況下都是比可選的更不可讀,這只是使用普通的二進制加法運算符。例如:

for (int i = 0; i < GetCount() + 1; i++) { } 

我都贊成語言團隊的防止你在任何情況下,當寫不可讀代碼,你做到這一點,有一個簡單的選擇。

+0

喬恩,這確實是功能選擇的好點。然後(i ++ vs i + = 1),你認爲++/- 運算符是否被選爲C#語言特徵主要是爲了紀念c/C++世界的歷史(例如getcount()++是可能的情況下)?比方說,如果你現在正在發明一種全新的語言,你現在會在C#中爲變量添加這個運算符嗎? –

+0

@Arman:我會*可能*仍然包括'i ++'和'++ i',是的。它們足夠方便且足夠有用,可以包含,但是我*不認爲我想包含'get_count()++'。我不認爲能夠做到這是一件好事。 –

+0

Jon,'很可能' - 很少但是有疑問:)好吧,我對這個功能感到滿意,因爲大多數開發者只是想知道語言/編譯器專業人士的意見。與C#中有一個很好的功能相比,這不會是壞事,例如x#會將浮點數增加一半,就像在半音中用音符表示:)。謝謝回覆。 –

0

在使用這些操作符之前,您應該嘗試閱讀他們如何執行操作。特別是你應該理解後綴和前綴之間的區別,這有助於弄清楚什麼是不允許的。

++和 - 操作符修改它們的操作數。這意味着操作數必須是可修改的。如果你可以爲有問題的表達式賦值,那麼它是可以修改的,並且可能是一個變量(c#)。

看看這些操作員實際做了什麼。後綴運算符應該在您的代碼行執行後遞增。至於前綴運算符,他們需要在方法被調用之前訪問該值。我讀了語法的方式是++lvalue (or ++variable)轉換爲memory operations:[read, write, read]lvalue++[read, read, write]雖然許多編譯器可能優化二次讀取。

因此,看着foo()++;值將被執行代碼的中心死亡。這意味着在代碼行完成執行後,編譯器需要將該值保存在更長遠的地方,以便在所述值上執行操作。毫無疑問,C++不支持這種語法的確切原因。

如果您要返回引用,則編譯器不會對後綴造成任何問題。當然,在C#中,值類型(即int,char,float等)不能通過引用傳遞,因爲它們是類型。

相關問題