在一次采访中,我被要求改变CPP中的常数值,但我在CPP中说这是不可能的,但在c中可以使用指针。
采访者说使用CPP是可能的并且让我尝试但我不能和我回到我的房间并再次尝试但是我发现我能够在C中更改但是相同的代码却出现错误当编译为C ++时。
#include<stdio.h>
main()
{
const int i=5;
int *p;
p=&i;
*p=8;
printf("%d",i);
}
这段代码在c中改变了i的常量值,但是当我在CPP中编译时 我收到一个错误:
invalid conversion from 'const int*' to 'int*'
答案 0 :(得分:3)
鉴于您的错误,实际程序必须如下:
#include<stdio.h>
main()
{
const int i=5;
int *p;
p=&i;
*p=8;
printf("%d",i);
}
这会产生一个警告:gcc:
警告:分配丢弃&#39; const&#39;指针目标类型的限定符
和g ++的错误:
错误:来自&#39; const int *&#39;的无效转换到&#39; int *&#39;
因此,让我们将问题的标题更改为更好的标题:
为什么C允许从
const int *
转换为int *
,但C ++没有?
一个人发出警告而另一个发出错误的原因并不是因为一个人允许你放弃const
限定符而另一个人没有。它仅仅是因为C标准留下了诸如未定义行为之类的错误操作,而C ++标准特别将其标记为错误。无论哪种方式,这样做都是错误的。
您可以阅读this similar question asking why this is possible in C。
答案 1 :(得分:1)
我认为面试官想要这个:
int n = 0;
int const *p = &n;
表达式&n
的类型为“指向int
的指针。”p
的声明将&n
转换为“指向const int
的指针”,添加了此过程中的const
限定符。这是有效的资格转换。此转换绝不会使n
的声明无效。 该程序仍然可以使用n
来更改int
对象,即使它无法使用*p
同样的目的。
*p = 5; // wrong
但是
n = 5; // OK
现在*p
是5
,虽然它是const
类型!
现在尝试在GCC或g ++中运行此代码,它将起作用:
#include<stdio.h>
int main()
{
int n = 0;
const int *p;
p=&n;
printf("%d\n",*p);
n = 5;
printf("%d\n",*p);
return 0;
}
编辑:在C和C ++中更改const
限定对象值的唯一方法是,更改初始化语句中的值:
const int i = 5 ---> const int i = 8
答案 2 :(得分:0)
这就是const_cast存在的原因,我相信面试官问这个是因为他们必须处理设计不佳的图书馆代码而他们无法控制,但通常情况下你不应该诉诸于生产