12
const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);

コンパイラによっては、10 または 20 のいずれかを出力できますか?

4

5 に答える 5

15

コンパイラによっては、10 または 20 のいずれかを出力できますか?

はい、または鼻の悪魔でさえ現れる可能性があります。オブジェクトの変更は制約違反であるため、このプログラムの動作は定義されておらず、コードの形式が正しくありません。const

于 2013-08-02T06:28:45.103 に答える
11

書かれているように、コードには未定義の動作があるため、そうです、10 または 20 またはその他のもの (アクセス違反など) が返される可能性があります。

于 2013-08-02T06:28:56.710 に答える
6

これは未定義の動作です:

C11 6.7.3 型修飾子

const 修飾されていない型の左辺値を使用して、const 修飾された型で定義されたオブジェクトを変更しようとした場合、動作は未定義です。volatile 修飾されていない型の左辺値を使用して、volatile 修飾された型で定義されたオブジェクトを参照しようとした場合、動作は未定義です。

于 2013-08-02T06:30:25.730 に答える
6

はい、それは未定義の動作であり、これがそれについて語っている場所だと思います。

C99 セクション 6.7.3 パラグラフ 5

const 修飾されていない型の左辺値を使用して、const 修飾された型で定義されたオブジェクトを変更しようとすると、動作は undefined になります。volatile 修飾されていない型の左辺値を使用して、volatile 修飾された型で定義されたオブジェクトを参照しようとした場合、動作は未定義です.115)

于 2013-08-02T06:30:43.767 に答える
3

を実行する*p=20と、許可されていない定数の値を変更しようとしています。

于 2013-08-02T06:26:49.290 に答える