为什么我能够改变这里用const int的价值?
#include <stdio.h>
main()
{
const int x = 10;
int *p;
p=&x;
*p=20;
printf("Value at p: %d \n",*p);
printf("Value at x: %d", x);
}
我得到的输出是:
值在P:20
值x处:20
因此,恒定的变量的值被改变。这是使用指针的缺点之一吗?
请查看以下错误消息:
error: invalid conversion from ‘const int*’ to ‘int*’
const int
,int const
,const int *
,int const *
,请看到这个帖子:const int = int const?
这只是你如何使用它。
您使用的int*
指向一个const
INT。你应该:
error: invalid conversion from ‘const int*’ to ‘int*’
当你这样做:
p = &x;
你可能需要更新您的编译器,一个体面的编译器应该告诉你这个错误,或者至少给你警告这一点。
但他没有,因为他使用了一个糟糕的编译器,我想。 – Elazar 2013-05-06 01:35:08
@Elazar我想是的。或者可能是旧的版本编译器 – taocp 2013-05-06 01:35:27
我使用gcc!我认为gcc足够好了! – user2350631 2013-05-06 01:38:15
那是因为你使用了错误的方式和C语言编译器让你编译这段代码,而只给予警告
warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
而且有答案了,关于SO,如warning: assignment discards qualifiers from pointer target type
任何像样的编译器会告诉你,你被抛弃const属性。
ç假定程序员永远是对的,因此,它是你的选择忽略编译器的警告或不。像往常一样,只要你知道你在做什么,这不是一个缺点!
正如其他答案已经注意到,编写一个程序,试图修改const
这样的限定变量导致程序有未定义的行为。这意味着您的程序可以做任何事情 - 作为这方面的一个例子,当我启用的优化编译程序,我看到这样的输出:
Value at p: 20
Value at x: 10
..和如果我的static
限定符添加到变量x
然后该程序在运行时崩溃。
C不会阻止你做这样愚蠢的事。你得到来自编译器警告,虽然:'const.c:9:警告:分配丢弃了指针目标type' – MatthewD 2013-05-06 01:33:24
'的#include“stdio.h中”'=>'#包括预选赛'注意 –
Elazar
2013-05-06 01:36:23
这取决于编译器和优化已启用,您可以在输出中获得“Value at x:10”。 – fbafelipe 2013-05-06 01:49:36