可以抛弃constness导致未定义的行为?

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

是否可以输出10或20,具体取决于编译器?

是否可以输出10或20,具体取决于编译器?

是的,甚至可以出现鼻子恶魔。 此程序的行为未定义,代码格式错误,因为修改const对象是违反约束的行为。

在编写时,您的代码具有未定义的行为,所以是的,您可以获得10或20或其他任何内容(例如,访问冲突)。

这是未定义的行为:

C11 6.7.3类型限定符

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。 如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为未定义。

是的,它是未定义的行为,我认为这就是它的地方。

C99第6.7.3节第5段

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义 。 如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为是未定义的.15)

当你执行*p=20 ,您试图更改常量的值,这是不允许的。