考慮以下幾點:C++:修改陣列值常量
int a[2];
cin >> a[0] >> a[1];
const int D = a[1] - a[0];
cout << D << "\n";
a[1] = 5; a[0] = 2;
cout << D << "\n";
我現在有點糊塗。爲什麼它爲D打印相同的值?爲什麼不改變數組值會改變D的值?在什麼時間點確定和存儲D的值?
謝謝!
考慮以下幾點:C++:修改陣列值常量
int a[2];
cin >> a[0] >> a[1];
const int D = a[1] - a[0];
cout << D << "\n";
a[1] = 5; a[0] = 2;
cout << D << "\n";
我現在有點糊塗。爲什麼它爲D打印相同的值?爲什麼不改變數組值會改變D的值?在什麼時間點確定和存儲D的值?
謝謝!
D
的值在您分配的行中確定。它不能僅僅因爲用來計算它的表達式中的值發生變化,即使它沒有被聲明爲const
。 (很少有編程語言的變量可以像Excel電子表格單元一樣工作:重新計算所有內容的成本將是不可預測的,但意義重大。)
如果要使D
的值發生更改,則必須明確指定一個新值,編譯器不會讓你這樣做,除非你刪除const
。
d的值計算和存儲在這一行:
const int D = a[1] - a[0];
d現在與它自己的值的變量。 D是常量,它的值永遠不會改變(沒有黑客攻擊)。
C++變量(和任何編程語言變量)沒有定義爲 與其他變量的關係。它們被定義爲可更改(或不可更改)的值。
有些語言會改變它。 prolog kinda-sorta這樣做。通過名稱值也可以做類似的事情。 – JoshD 2010-10-08 06:15:52
const int D = a[1] - a[0];
就在那裏。此時,D
的值由當前值a[1]
和a[0]
確定並存儲。然後它完全從a[1]
和a[0]
斷開。對這兩者的更改將不再對D
產生影響。
在絕大多數編程語言中,這正是它的工作原理。 =
運算符稱爲賦值運算符。它將右邊的表達式結果並將其分配給左邊的變量。它的價值而不是參考。所以它只會將執行時的值賦給變量。該變量不會隨着第二次分配而改變。
在C++和其他一些語言中,有些情況並非嚴格對待指針。並期待這樣的:
int b = 5;
int *d = &b;
右側的表達式是被分配給一個指針(單個)變量的地址(&
操作是地址運算符,*
操作上聲明聲明d
是一個指針)。指針然後包含該變量的地址。它在解除引用時的值是變量的值。但是,指針只能保存單個變量的值。他們不能成爲表達的別名。但在進一步深入指出之前,您應該更好地掌握一般的語言。指針是相當複雜和先進的主題。
您可以爲D創建一個特殊的類,當它引用的值發生更改時,它會重新評估。這裏
class Diff
{
int & first;
int & second;
public:
Diff(int & a, int & b) :
first(a), second(b)
{
}
int get() const
{
return first - second;
}
};
std::ostream & operator<<(std::ostream & os, const Diff & diff)
{
return os << diff.get();
};
你的類依賴於兩個值就必須保持住,也就是說,如果其中一個超出範圍,你將在你的類不良引用。您可以重載操作符int()來代替get(),儘管隱式轉換重載通常被認爲是不好的做法。
這裏有一個反問題,應該幫助你思考如何工作的:
int a[2];
cin >> a[0] >> a[1];
int D = a[1] - a[0];
D = 6;
現在,改變d後,應在[0]和[1]爲1和5,2和4,還是3和3?
如果這沒有意義,那麼爲什麼它應該反過來呢?
我發現[本文](http://www.codinghorror.com/blog/2006/07/separating-programming-sheep-from-non-programming-goats.html)可疑相關。 – JoshD 2010-10-08 06:17:57