新しい変数を宣言せずに、C++ でaconst int
を anにキャストできますか? int
このオプションは VS で使用できますが、Xcode やコード ブロックなどの他のコンパイラではどのように使用できますか?
const int a = 5 ;
int (a) ++ ;
新しい変数を宣言せずに、C++ でaconst int
を anにキャストできますか? int
このオプションは VS で使用できますが、Xcode やコード ブロックなどの他のコンパイラではどのように使用できますか?
const int a = 5 ;
int (a) ++ ;
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」が変更されないという約束に基づいて、コンパイラが命令と順序付けを生成するため、これが最悪の場合は高度に最適化されます。