-2

私たちが知っているように、定数変数の値は不変です。ただし、定数変数のポインターを使用してそれを変更できます。

#include <iostream>

int main()
{
    const int integer = 2;
    void* tmp = (void*)&integer;
    int* pointer = (int*)tmp;

    (*pointer)++;

    std::cout << *pointer << std::endl;
    std::cout << integer << std::endl;

    return 0;
}

そのコードの出力は次のとおりです。

3
2

それで、私は一体何を変更したのか混乱していますか?は何integerの略ですか?

4

5 に答える 5

4

s の変更constは未定義です。コンパイラは、const値をメモリの読み取り専用部分に自由に格納し、それらを変更しようとするとエラーをスローします (自由に、義務ではありません)。未定義の動作は貧弱で望ましくなく、回避する必要があります。要約すると、それをしないでください。

PSintegerpointerはコード内の変数名ですが、特に良い名前ではありません。

于 2013-12-21T09:31:28.873 に答える
3

安全でない C スタイルのキャストを使用して constness を破棄しました。C++ は本質的に安全な言語ではないため、そのようなクレイジーなことを行うことができます。それはあなたがすべきだという意味ではありません。実際、C++ では C スタイルのキャストをまったく使用しないでください。代わりに、reinterpret_cast、const_cast、static_cast、および dynamic_cast を使用してください。これを行うと、const 値を変更する方法は const_cast を使用することであることがわかります。これはまさに言語の設計方法です。

于 2013-12-21T09:24:30.577 に答える
0

これは未定義の動作です。得られる出力はコンパイラに依存します。この動作の 1 つの考えられる説明は次のとおりです。

を定数として宣言integerし、式で使用すると、コンパイラが最適化され、割り当てた定数リテラルに置き換えられます。ただし、 が指すメモリ位置の実際の内容&integerは変更されます。定数として定義しているため、コンパイラは単にこの事実を無視します。

C++ の Const Correctness を参照してください。このページの「Const_cast オペレーター」セクションのすぐ上にあるアセンブラーの出力に注目してください。

于 2013-12-21T10:15:25.603 に答える
-1

const キーワードは、コンパイラの単なるヒントです。コンパイラは、変数が const かどうかをチェックし、const 変数を直接変更すると、コンパイラは間違った結果をもたらします。しかし、const 変数を保護するための変数ストレージのメカニズムはありません。そのため、オペレーティング システムはどの変数が const であるかどうかを知ることができません。

于 2013-12-21T09:36:10.747 に答える