2011-06-29 24 views
-2

我現在才知道的一件事。問題是關於C中的const限定符。在我的程序中,我想更改用const限定符定義的變量的值。任何方式來改變一個變量的值,在c中用const限定符定義的變量?

例如:

int main() 
{ 
const int i=40; 
i=50 ; // error 
} 

但是有什麼辦法改變我的值按上述example.Please讓我知道。 謝謝

+0

「我想改變一個用const限定符定義的變量的值」這聽起來像你可能不瞭解const的目的。 –

+3

我的一部分死在裏面。 – Dair

+0

@James McNellis:C的定義是這樣的,有時你必須用'const'限定符來定義一個變量,但不能給它賦值(例如包含自引用指針的複雜數據結構)。你想要的變量是'常量',但然後你卡... –

回答

5

首先,你可能不應該正在做這個。

其次,是的,你可以的,如果你利用其地址和引用它必須:

const int i = 40; 
*(int*)&i = 50; 
// i is now 50 

第三,請你,請不要這樣做。

編輯:這一點,正如其他人指出,展品未定義的行爲。你假設你的編譯器會將這個值存儲在一個可尋址的位置,這不是必須的。 (一個常數值可以用它的直接值來代替,並且「考慮它」並不意味着什麼)。你被警告過了。

+0

這是C中的「明確定義」還是實現細節? – 2011-06-29 05:14:28

+0

我的頭腦被吹了 –

+0

這些答案讓我覺得我一無所知。 – Dair

7

在任何有明確定義的行爲的程序中,i不能修改。

C99§6.7.3(「類型限定符」)/ 5狀態清楚:

如果試圖通過一個左值的使用 與非修改與常量限定類型定義的對象-const-qualified類型,行爲是未定義的。

i是一個用const限定類型(const int)定義的對象。它是一個不可修改的左值:因爲它是常量限定的,所以不能修改它。修改它的唯一方法是使用一個強制轉換去除const限定,這會導致程序顯示未定義的行爲。

4

有兩種方法。

首先是一種你不感興趣的方式。標準允許這種情況發生,但你可能無法控制它,所以你並不真正感興趣。該標準說,你可以定義類似

const volatile int *pSomething; 

因爲實現可能需要更改指向的東西(例如,它可能是一個定時器),但你可以更改它禁止你的程序。

其次是您感興趣的方式,但標準不允許。妍已經給出了這樣的答案。

*(int*)&i 

根據什麼是可修改的左值的規則是一個可修改的左值。但是,如果實際嘗試修改此左值,則違反了標準,因爲實際對象i被定義爲const。結果是未定義的行爲。這個實現可能會做你想做的事情,或者它可能讓我保持不變,它可能會中止你的程序,或者它可能會格式化你的硬盤。

這是一種做你可能想做的事情的方法。

int theRealI; 
const int *pTheRealI = &theRealI; 
#define i (*pTheRealI) 

然後我會是隻讀的,但如果你想修改theRealI你可以。

相關問題