簡體   English   中英

在c ++中從const int轉換為int

[英]Casting from const int to int in c++

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

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

aconst 你不能合法地刪除constness來改變任何編譯器中的變量。 你在VS中看到的是它讓你創建一個未命名的臨時和遞增的東西。

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沒有改變。 它可以自由地繼續行為,因為它沒有。 因此,如果它將它加載到一個寄存器中,如果它根據它進行了大小調整,那么只需繼續並假設它可以使用值“5”,只要它看到“a”。 例如:

#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”沒有改變的承諾產生指令和排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM