里面的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
可以是 1
、100
或 "puppy"
。
首先,你做不到
scanf("%p",&p);
printf("p point to %p\r\n",p);
*p=100;
因为你可能不拥有那段记忆。即使你这样做了,写信给它也可能是非法的。就像这里的情况一样。
如果您这样做(更改 a
地址处的值)或使用 const_cast
然后尝试修改 a
,则会出现另一个未定义行为的实例。您承诺 a
是 const
- 不要更改它。
结果是 UB 并且发生这种行为可能是因为编译器将 printf("a's value is %d\r\n",a);
优化为简单的 printf("a's value is %d\r\n",1);
,因为它相信您不会修改 a
(可耻在他身上)。
const
关键字指定变量的值是常量,并告诉编译器防止程序员修改它。
#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
可以是 1
、100
或 "puppy"
。
首先,你做不到
scanf("%p",&p);
printf("p point to %p\r\n",p);
*p=100;
因为你可能不拥有那段记忆。即使你这样做了,写信给它也可能是非法的。就像这里的情况一样。
如果您这样做(更改 a
地址处的值)或使用 const_cast
然后尝试修改 a
,则会出现另一个未定义行为的实例。您承诺 a
是 const
- 不要更改它。
结果是 UB 并且发生这种行为可能是因为编译器将 printf("a's value is %d\r\n",a);
优化为简单的 printf("a's value is %d\r\n",1);
,因为它相信您不会修改 a
(可耻在他身上)。
const
关键字指定变量的值是常量,并告诉编译器防止程序员修改它。