内部的const变量是什么?

时间:2015-02-03 14:20:42

标签: c++ c const point

#include <stdio.h>

int main()
{
  const int a=1;
  printf("a's address is %p\r\n",&a);
  printf("input a's address\r\n");
  int *p=NULL;
  //here let p point to a;
  scanf("%p",&p);
  printf("p point to  %p\r\n",p);
  *p=100;
  // I suppose a will be 100, but acturlly a is still 1...
  printf("a's value is %d\r\n",a);
  printf("*p's value is %d\r\n",*p);

  return 0;
}

为什么a仍然是1而不是100

但如果我将a声明为:

int a =1;

有效!

那么,怎么回事?

3 个答案:

答案 0 :(得分:2)

您的代码中有几个地方可以调用未定义的行为,这意味着任何事情都可能发生。 a可以是1100"puppy"

首先,你不能做

scanf("%p",&p);
printf("p point to  %p\r\n",p);
*p=100;

因为你可能没有那段记忆。即使你这样做,写信也许是违法的。就像这样的情况。

如果您这样做(更改a地址处的值)或使用const_cast然后尝试修改a,则会出现另一个未定义行为的实例。您承诺aconst - 请勿更改。

结果是UB并且行为可能发生,因为编译器将printf("a's value is %d\r\n",a);优化为简单的printf("a's value is %d\r\n",1);,因为它相信你不会修改a(对他的羞耻) )。

答案 1 :(得分:0)

当您将a声明为const时,编译器可以自由地假设它无法更改。您合成指向它的指针并尝试修改它并不重要,因为(显然)您的编译器在a时优化了const的实际负载。

答案 2 :(得分:0)

const关键字指定变量的值是常量,并告诉编译器阻止程序员修改它。