首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的"some“== "some\0”和strcmp("some","some\0")有什么区别?

c++中的"some“== "some\0”和strcmp("some","some\0")有什么区别?
EN

Stack Overflow用户
提问于 2011-07-16 12:06:36
回答 3查看 424关注 0票数 1

在c++中,"some" == "some\0"strcmp("some","some\0")有什么不同?

为什么if("some" == "some\0")返回falseif(!strcmp("some","some\0"))返回true

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-16 12:13:56

请参见下图。它在内存中显示了两个字符串,它们的内容在框中,在框的旁边,您将看到每个字符串的地址。

当你在做if("some" == "some\0")的时候,你是在比较地址。它被翻译成if (0xdeadbeef == 0x0badcafe),这显然是错误的。

当您使用strcmp时,您将比较每个框的内容,直到您到达每个框中的\0。这就是为什么第二个测试返回true的原因。

如果您将第一个测试更改为if("some" == "some"),那么编译器may potentially会看到它们是相同的字符串,并且只存储它们一次。这意味着您的测试将转换为if (0x0badcafe == 0x0badcafe),这显然是正确的。

票数 5
EN

Stack Overflow用户

发布于 2011-07-16 12:10:35

代码语言:javascript
复制
"some" == "some\0" 

按字符串的地址比较字符串文字。这些文字是存储在不同内存位置中的。所以总是使用false

代码语言:javascript
复制
!strcmp("some","some\0")

比较字符串的内容。因此,在这种情况下,"some\0""some"是相同的。所以true

编辑:从你的评论中,你会问为什么"some" == "some"true。这是因为大多数编译器都足够聪明,能够重用字符串文字(当它们存储在只读区域中时)。这就是它返回true的原因。

附注:在以下情况下,"some“不是以只读方式存储的:

代码语言:javascript
复制
char a[] = "some";
票数 9
EN

Stack Overflow用户

发布于 2011-07-16 12:11:53

"some"的类型是const char*,所以当您比较"some"=="some\0"时,您是在比较两个const char*指针。由于它们可能不指向相同的内存位置,因此比较通常会失败。在第二种情况下,您使用的是strcmp,它通过遍历字符串中的单个字符来比较字符串。

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

https://stackoverflow.com/questions/6715247

复制
相关文章

相似问题

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