为什么可以使用scanf更改const int?

时间:2014-10-20 05:21:05

标签: c const

我无法理解为什么这样做。

#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
}  

3 个答案:

答案 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限定类型定义的对象,则行为是未定义的。