2010-03-04 11 views

回答

34

是的,它等同於:

int bar() 
{ 
    int temp = x; 
    ++x; 
    return temp; 
} 
+0

很好的解釋,謝謝。 – patros 2010-03-04 16:25:41

+0

如果'int'不是'int',而是'MyClassWithOverloadedOperators',那麼你就錯了。 – 2010-03-04 18:39:08

+4

@Pavel:我不同意。帶有重載的後增值操作符的類沒有實現正確的增量後語義是錯誤的。 – Void 2010-03-04 18:56:56

7

是的,這是......這將返回X的值增加它的x值之前和之後,這將是+ 1 ...如果它很重要。

4

它被定義。

它返回的x遞增前值。如果x是本地(非靜態)變量,則此函數增量不起作用,因爲函數返回後,函數的局部變量將不再存在。但如果x是一個本地靜態變量,全局變量或實例變量(如您的情況),它的值將在返回後遞增。

+0

但在重載''++的 - 運算符的情況下會發生什麼的自定義類?它會起作用嗎? – Dario 2010-03-04 16:22:17

+2

@Dario是的,它會。執行返回之前,將完全評估「返回」後面的表達式。 – 2010-03-04 16:24:34

+1

@Dario。是的,基於與返回x.dosomething();'完全相同的原因,'dosomething'的效果將在返回之前執行。重載的後增量並不神奇,它只是一個返回值的函數,恰好是舊值。 – 2010-03-04 16:47:03

4

是。

postincrement(x ++)評估x的值(在您的情況下返回)在添加之前。

preincrement(++ x)中,在添加後,評估x的值

編輯:您可以比較鏈接中prepost增量的定義。

1

大多數編程語言,如C++,是在操作執行的順序(我不是做如何的代碼實際上是由編譯器在這裏實現的任何暗示)遞歸。由任何明確定義的操作組成的複合操作本身都有明確的定義,因爲每個操作都是在後進先出的基礎上進行的。

後遞增返回變量值遞增之前遞增它,因此return操作收到該值。這種行爲沒有特別的定義。

+1

我不認爲關心的是會返回什麼樣的價值,而是關於增量是否會發生。如果你的心智模型認爲「返回」導致函數立即終止,這是一個可以理解的擔憂 - 如果函數已經結束,是否真的有時間應用增量?當然,我們知道答案是*是*,但僅僅是因爲編譯器像Poita的答案那樣執行轉換,以確保該函數在所有副作用被應用之前不會實際返回。 – 2010-03-04 23:32:13

+0

這就是我的意思。在'x ++'「返回」之後遇到'return'語句。由於'x ++'是一種操作,因此應該認爲它與Poita_提供的演示代碼一樣。這樣,很容易看出,因爲'x ++'被執行並且它的返回值被傳遞給'return'語句。沒有任何意義,'x ++'會返回並*然後*遞增。 – 2010-03-09 16:12:40

相關問題