1

const が変更されたときに何が起こるかは、一部の C 標準 (おそらく 99 ?) では未定義です。しかし、ある学生がコードを提示してくれたので、それを修正しました。

定数変数のアドレスについて特別なことは何もわかりませんa&aとが同じであることを確認したbので、コンパイラは微妙に他の場所を指していません。しかし、代入*bしてもconst値は変わりません。

私は最適化を実行していません。-gデバッグするフラグを指定してコンパイルし、コードにステップインすると、期待どおりの結果が得られます (変数のメモリ位置がa変更されます)。ただし、以下に示すコードは の更新された値を反映していませんa

これは、最適化なしで、デバッグモードでも一時がレジスタに配置されているということですか?

#include <iostream>

using namespace std;

int main(){
    const int a = 15;
    cout << a << '\n';
    int * b= (int*)&a;
    cout << &a << "\n";
    cout << b << "\n";
    *b = 20;
    cout << *b << '\n';
    cout << a << '\n';

    int x = a;
    cout << x << '\n';
    x = *b;
    cout << x << '\n';
    return 1;
}
4

1 に答える 1

5

これは、C++ の未定義の動作でもあります。ドラフト C++ 標準セクション7.1.6.1 The cv-qualifiers paragraph 4に移動すると、これを確認できます。

[...] const オブジェクトの有効期間中 (3.8) に変更を試みると、未定義の動作が発生します。

未定義の動作とは、結果が予測不可能であることを意味します。これは、一見すると直感に反するものであっても、結果が発生する可能性があることを事実上意味します。

Godboltを使用した簡単な実験では、最適化が行われていないため、コンパイラがメモリから取得して出力する代わりに-O0、リテラル値15を使用していることがわかります。a

movl    $15, %esi   #,

したがって、コンパイラは定数の折りたたみを実行していaます。あなたがそれが一定であると言ったので、これは完全に合理的です。15aa

于 2014-10-10T03:39:25.557 に答える