我有这段小代码。我正在使用gcc编译器:
#include <stdio.h>
int main()
{
const int a=10;
int *d;
d=&a;
*d=30;
printf("%d %d\n",a,*d);
return 0;
}
它会在编译时发出警告:
“赋值从指针目标类型中丢弃限定符”
但没有错误。输出为:30 30
那么它是否违背维护一个const变量的目的,该变量的值在整个程序执行期间是固定的(如果我错了请纠正我)?
答案 0 :(得分:4)
const
不是保证。这只是一个承诺。承诺可以被打破。编译器会在发生这种情况时发出警告,但是不需要它来阻止它,因为可能存在绕过常量可能有用的情况。
答案 1 :(得分:2)
以上行为未定义。如this示例所示,您也可以获得不同的值。此输出的解释是 - 编译器优化代码并用其值替换const变量。因此,当我们执行printf("%d %d %u %u\n",a,*d,&a,d);
时,我们可以看到差异,这些差异实际上已被修改为优化为printf("%d %d %u %u\n",10,*d,&a,d);
不要依赖任何这些输出。标准未定义实际行为。
答案 2 :(得分:0)
您不应该这样做,编译器会出于某种原因向您发出警告。但是,C / C ++会让你做任何你想做的事情。编写干净的代码取决于您。
您可以使用以下方法反映该值的常量:
int const * d = &a;
然后,修改d指向的内容会产生警告和错误。