2

次のプログラムの出力は、gcc で 50 です。x は定数変数であり、p は x の値を指す定数ポインタであるため、*p は x 自体であるため、どのように可能でしょうか。どこで Turbo c はコンパイラエラーを出しますか。それは未定義の動作ですか?説明してください。

#include<stdio.h>

int main()
{
    const int x = 25;
    int * const p = &x;
    *p = 2 * x;
    printf("%d", x);
    return 0;
}
4

2 に答える 2

9

変更することは可能ですが、標準で言及されているように、動作は未定義です!

6.7.3の下のc11にあります

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

于 2013-08-24T08:58:09.597 に答える
3
int * const p=&x;

これは有効なプログラムではありません。&xconst int *ですが、ポインタ値を型 のオブジェクトに割り当てていますint * const。コンパイラは警告を発行する必要があり、コンパイルを停止することができます。

于 2013-08-24T08:59:39.020 に答える