如果我有例如用實例方法和變量是return x ++的行爲;界定?
class Foo
{
...
int x;
int bar() { return x++; }
};
一個類定義返回後增加的變量的行爲?
如果我有例如用實例方法和變量是return x ++的行爲;界定?
class Foo
{
...
int x;
int bar() { return x++; }
};
一個類定義返回後增加的變量的行爲?
是的,它等同於:
int bar()
{
int temp = x;
++x;
return temp;
}
是的,這是......這將返回X的值增加它的x值之前和之後,這將是+ 1 ...如果它很重要。
它被定義。
它返回的x
遞增前值。如果x
是本地(非靜態)變量,則此函數增量不起作用,因爲函數返回後,函數的局部變量將不再存在。但如果x
是一個本地靜態變量,全局變量或實例變量(如您的情況),它的值將在返回後遞增。
但在重載''++的 - 運算符的情況下會發生什麼的自定義類?它會起作用嗎? – Dario 2010-03-04 16:22:17
@Dario是的,它會。執行返回之前,將完全評估「返回」後面的表達式。 – 2010-03-04 16:24:34
@Dario。是的,基於與返回x.dosomething();'完全相同的原因,'dosomething'的效果將在返回之前執行。重載的後增量並不神奇,它只是一個返回值的函數,恰好是舊值。 – 2010-03-04 16:47:03
大多數編程語言,如C++,是在操作執行的順序(我不是做如何的代碼實際上是由編譯器在這裏實現的任何暗示)遞歸。由任何明確定義的操作組成的複合操作本身都有明確的定義,因爲每個操作都是在後進先出的基礎上進行的。
後遞增返回變量值遞增之前遞增它,因此return
操作收到該值。這種行爲沒有特別的定義。
我不認爲關心的是會返回什麼樣的價值,而是關於增量是否會發生。如果你的心智模型認爲「返回」導致函數立即終止,這是一個可以理解的擔憂 - 如果函數已經結束,是否真的有時間應用增量?當然,我們知道答案是*是*,但僅僅是因爲編譯器像Poita的答案那樣執行轉換,以確保該函數在所有副作用被應用之前不會實際返回。 – 2010-03-04 23:32:13
這就是我的意思。在'x ++'「返回」之後遇到'return'語句。由於'x ++'是一種操作,因此應該認爲它與Poita_提供的演示代碼一樣。這樣,很容易看出,因爲'x ++'被執行並且它的返回值被傳遞給'return'語句。沒有任何意義,'x ++'會返回並*然後*遞增。 – 2010-03-09 16:12:40
很好的解釋,謝謝。 – patros 2010-03-04 16:25:41
如果'int'不是'int',而是'MyClassWithOverloadedOperators',那麼你就錯了。 – 2010-03-04 18:39:08
@Pavel:我不同意。帶有重載的後增值操作符的類沒有實現正確的增量後語義是錯誤的。 – Void 2010-03-04 18:56:56