C 常量变量值通过使用指针进行更改

C 常量变量值通过使用指针进行更改,c,C,以下程序的输出在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; } #包括 int main()

以下程序的输出在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;
}
#包括
int main()
{
常数int x=25;
int*常数p=&x;
*p=2*x;
printf(“%d”,x);
返回0;
}

可以更改,但行为未定义,如标准中所述

其在6.7.3下的c11中

如果试图通过使用具有非常量限定类型的左值来修改使用常量限定类型定义的对象,则该行为是未定义的。如果试图通过使用具有非易失性限定类型的左值来引用使用易失性限定类型定义的对象,则该行为是未定义的


这不是一个有效的程序
&x
类型为
常量int*
,但您正在将指针值分配给
int*常量类型的对象:编译器必须发出警告并允许停止编译。

如果这样做,其未定义的行为。我们的编译器不应允许这样做,不允许从<>代码> const int */COD>转换为<代码> int *const >:删除C++标签:这将不会编译为C++。C编译器可能会发出一个可怕的警告。int
main()
..@Krishna没有因为错误的指针分配而磨损
p=&x
?标准引号==automatic+1。
int * const p=&x;