首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么C++允许我将一个常量字符赋值给一个常量字符*?​!

为什么C++允许我将一个常量字符赋值给一个常量字符*?​!
EN

Stack Overflow用户
提问于 2012-08-19 14:31:42
回答 3查看 4K关注 0票数 71

令我惊讶的是,这段代码编译如下:

代码语言:javascript
复制
const char* c_str()
{
    static const char nullchar = '\0';
    return nullchar;
}

它在我的代码中引入了一个bug。谢天谢地,我抓住了它。

这是C++故意的,还是编译器的bug?是否存在主动忽略该数据类型的原因?

它可以在Visual C++ 2010和GCC中工作,但我不明白为什么它应该工作,考虑到明显的数据类型不匹配。( static也不是必需的。)

EN

回答 3

Stack Overflow用户

发布于 2012-08-19 15:09:41

它并没有忽略数据类型。这不是个bug。它利用了放入其中的const,并且看到它的值实际上是一个整数0 (char是一个整数类型)。

整数0是一个有效的(根据定义)空指针常量,它可以转换为指针类型(变成空指针)。

你想要空指针的原因是有一些“不指向任何地方”的指针值,并且可以是可检查的(例如,你可以将一个空指针与一个整数0进行比较,然后你会得到true )。

如果你删除了const,你会得到一个错误。如果你把double放入其中(就像许多其他非整数类型一样;我猜例外的只是那些可以通过重载转换运算符来转换为常量char*的类型),你会得到一个错误(即使没有常量)。以此类推。

在这种情况下,整个情况是,您的实现看到您返回的是一个空的ptr常量;您可以将其转换为指针类型。

票数 6
EN

Stack Overflow用户

发布于 2012-08-19 14:38:30

有一个自动转换。如果你能很好的运行这个程序:

代码语言:javascript
复制
#include <stdio.h>
const char* c_str()
{
    static const char nullchar = '\0';
    return nullchar;
}

int main()
{
    printf("%d" , sizeof(c_str()));
    return 0;
}

在我的电脑上,输出应该是4,->,指针的大小。

编译器自动强制转换。注意,至少gcc给了一个警告(我不知道VS)

票数 2
EN

Stack Overflow用户

发布于 2012-08-19 14:40:34

我认为这可能是空字符在类型之间很常见的事实。您要做的是在返回空字符时设置一个空指针。如果使用了任何其他字符,这将失败,因为您不是将字符的地址传递给指针,而是将字符的值传递给指针。Null是有效的指针和字符值,因此可以将null字符设置为指针。

简而言之,null可以被任何类型用来设置空值,而不管它是数组、指针还是变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12024706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档