【发布时间】:2013-05-08 17:06:15
【问题描述】:
考虑以下 2 个程序 prog1 和 prog2。如果我尝试使用指针 ptr 更改 const 限定变量 i 的值,我收到警告(不是错误)"initialization discards qualifiers from pointer target type|",但程序仍然运行并显示新值。但是如果我尝试使用赋值语句在第二个程序中更改 i 的值,我得到 错误(非警告)assignment of read-only variable 'i'|。
以下是由这个前提引起的混淆:
1) 为什么我们可以在任何情况下更改只读const 限定变量的值?这难道不违背使用const 限定符的目的吗?我们试图这样做吗?
2)即使由于某些奇怪的原因我们被允许更改常量的值,为什么要区分使用指针更改只读const 限定变量的值(这是允许的,但有警告)并通过使用赋值操作(这是不允许的并给我们一个错误)?
//prog1
#include <stdio.h>
int main ()
{
const int i=8;
int *ptr=&i;
*ptr=9;
printf("%d",*ptr); //Prints new value nevertheless
}
警告:初始化会丢弃来自指针目标类型的限定符|
//prog2
#include <stdio.h>
int main()
{
const int i=8;
i=10;
printf("%d",i);
}
错误:赋值只读变量'i'|
编辑 H2CO3
这里我不止一次改变const限定变量的值。我只得到一个警告,和prog1一样
//prog3
#include <stdio.h>
int main ()
{
const int i=8;
int *ptr=&i;
*ptr=9;
*ptr=10;
printf("%d",*ptr); //Prints 10
}
【问题讨论】:
-
更正了 2 个错别字。现在确定。
-
为什么?因为,主要是由于历史原因(以及不良的实践习惯),C 标准已经如此定义或实施。 (在 C++ 中可能有所不同)。
-
您没有意识到 prog1 没有违规,您在任何时候都不会更改任何 const 内容。您将指针设置为 const'd 指针,然后更改该指针。试试
int const* ptr = &i,然后再试一次。 -
@Shark Prog1 确实有约束违规。
-
因为 C 编译器信任程序员,不会尝试修复程序员的错误。
标签: c pointers constants assignment-operator