C中的const给出不可预测的输出

时间:2012-11-03 18:42:24

标签: c constants

  

可能重复:
  constants and pointers in C

我有这段小代码。我正在使用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变量的目的,该变量的值在整个程序执行期间是固定的(如果我错了请纠正我)?

3 个答案:

答案 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指向的内容会产生警告和错误。