里面的const变量是什么?

What's a const variable inside?

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

有效!

那么,进展如何?

当您将 a 声明为 const 时,编译器可以自由地假定它永远不会更改。你合成一个指向它的指针并尝试修改它并不重要,因为(显然)你的编译器已经优化了 a 的实际加载,当它是 const.

您的代码中有几个地方可以调用未定义的行为,这意味着任何事情都可能发生。 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(可耻在他身上)。

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