我們是否可以在不聲明新變量的情況下使用C++將const int
轉換爲int
? 該選項在VS中可用,但它如何用於其他編譯器,如Xcode,代碼塊等?從const int轉換爲C++中的int
const int a = 5 ;
int (a) ++ ;
我們是否可以在不聲明新變量的情況下使用C++將const int
轉換爲int
? 該選項在VS中可用,但它如何用於其他編譯器,如Xcode,代碼塊等?從const int轉換爲C++中的int
const int a = 5 ;
int (a) ++ ;
a
是const
。你不能合法地刪除常量來改變任何編譯器中的變量。你在VS中看到的是它讓你創建一個未命名的臨時文件並增加這個值。
@John Dibling我忍者編輯我的答案,添加「變異變量」的話可能在你寫這個評論時。 –
忍者編輯! HOI-CHA! –
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」不會改變。
*注意:''const_cast'也處理引用,我推薦'const_cast
以任何方式修改'const' *喚起未定義的行爲。不要。 –