我无法理解为什么这样做。
#include<stdio.h>
void main(){
const int x = 100;
printf("x = %d \n",x);
scanf("%d",&x); //working fine
printf("x = %d \n",x); //prints the new value
}
答案 0 :(得分:4)
它没有正常工作,修改const变量是未定义的行为。任何事情都可能发生。
将-Wall
与GCC一起使用,您会看到:
警告:写入常量对象(arg 2)
答案 1 :(得分:2)
一般来说是UB。
在你的情况下,你可能会看到一个铸造的结果
例如:
void main(void)
{
int const x = 100;
int *x2 = &x;
*x2 = 2;
}
正在我的机器上工作,但是
void main(void)
{
int const x = 100;
x = 2;
}
不是(编译错误)。
无论如何,最好不要更改const变量。
答案 2 :(得分:2)
可以更改它,但行为未定义,正如标准中提到的那样!
在c11下6.7.3
如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为是未定义的。