2010-10-08 72 views
1

考慮以下幾點: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的值?

謝謝!

+1

我發現[本文](http://www.codinghorror.com/blog/2006/07/separating-programming-sheep-from-non-programming-goats.html)可疑相關。 – JoshD 2010-10-08 06:17:57

回答

2

D的值在您分配的行中確定。它不能僅僅因爲用來計算它的表達式中的值發生變化,即使它沒有被聲明爲const。 (很少有編程語言的變量可以像Excel電子表格單元一樣工作:重新計算所有內容的成本將是不可預測的,但意義重大。)

如果要使D的值發生更改,則必須明確指定一個新值,編譯器不會讓你這樣做,除非你刪除const

0

d的值計算和存儲在這一行:

const int D = a[1] - a[0]; 

d現在與它自己的值的變量。 D是常量,它的值永遠不會改變(沒有黑客攻擊)。

C++變量(和任何編程語言變量)沒有定義爲 與其他變量的關係。它們被定義爲可更改(或不可更改)的值。

+0

有些語言會改變它。 prolog kinda-sorta這樣做。通過名稱值也可以做類似的事情。 – JoshD 2010-10-08 06:15:52

0
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是一個指針)。指針然後包含該變量的地址。它在解除引用時的值是變量的值。但是,指針只能保存單個變量的值。他們不能成爲表達的別名。但在進一步深入指出之前,您應該更好地掌握一般的語言。指針是相當複雜和先進的主題。

1

您可以爲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(),儘管隱式轉換重載通常被認爲是不好的做法。

0

這裏有一個反問題,應該幫助你思考如何工作的:

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?

如果這沒有意義,那麼爲什麼它應該反過來呢?