2013-10-16 172 views
1

我們是否可以在不聲明新變量的情況下使用C++將const int轉換爲int? 該選項在VS中可用,但它如何用於其他編譯器,如Xcode,代碼塊等?從const int轉換爲C++中的int

const int a = 5 ; 
int (a) ++ ; 
+4

以任何方式修改'const' *喚起未定義的行爲。不要。 –

回答

4

aconst。你不能合法地刪除常量來改變任何編譯器中的變量。你在VS中看到的是它讓你創建一個未命名的臨時文件並增加這個值。

+0

@John Dibling我忍者編輯我的答案,添加「變異變量」的話可能在你寫這個評論時。 –

+1

忍者編輯! HOI-CHA! –

0

TL; DR:您可以更改const變量的值,但不能保證您的代碼的行爲與您一樣。

還有就是,當然是一個辦法做到這一點,先讓我們確保你理解你問做什麼:

const int a = 5; 

這告訴編譯器有一個值,5,要稱其爲「A」,例如,所以你可以這樣做:

const int MaxNameLen = 5; 
char name[MaxNameLen + 1]; 

const float pi = 3.14; 
return pi * radius; 

編譯時沒有選擇這可能會產生代碼,像任何其他注入變量一樣使用它,就像你期望的那樣。

但是通過調用變量「const」,您已經與編譯器簽訂了一個合約:按照這個值不會改變。所以你可以這樣做,例如:

int a = 5; 
*(static_cast<int*>(&a))++; 

但是就編譯器而言,a沒有改變。它可以繼續像以前那樣行事。所以如果它把它加載到一個寄存器中,如果它根據它來確定一些東西的大小,就可以自由地繼續前進,並假定它可以在任何看到「a」的地方使用值「5」。例如:

#include <iostream> 
using namespace std; 

int main() 
    { 
    const int a = 5; 
    (*const_cast<int*>(&a))++; 
    std::cout << "a = " << a << std::endl; 
} 

可能打印5或它可能打印6,取決於哪個編譯器,哪些設置和代碼的上下文。變量「a」有一個地址,但你告訴編譯器它不會改變,所以它可能已經把它推到棧上或者把它加載到一個寄存器中。

如果這會損害你,最糟糕的是高度優化,因爲編譯器將根據你的承諾產生指令和順序,使得「a」不會改變。

+1

*注意:''const_cast'也處理引用,我推薦'const_cast (a)++'。 –