1

新しい変数を宣言せずに、C++ でaconst intを anにキャストできますか? intこのオプションは VS で使用できますが、Xcode やコード ブロックなどの他のコンパイラではどのように使用できますか?

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

2 に答える 2

0

TL;DR: const 変数の値を変更することはできますが、変更した場合と同じようにコードが動作することを保証することはできません。

もちろん、それを行う方法はありますが、最初に、何を求めているのかを理解していることを確認してください。

const int a = 5;

これは、たとえば「a」として参照したい値 5 があることをコンパイラに伝えます。

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」が変更されないという約束に基づいて、コンパイラが命令と順序付けを生成するため、これが最悪の場合は高度に最適化されます。

于 2013-10-16T21:00:11.440 に答える