在c++中,"some" == "some\0"和strcmp("some","some\0")有什么不同?
为什么if("some" == "some\0")返回false,if(!strcmp("some","some\0"))返回true?
发布于 2011-07-16 12:13:56
请参见下图。它在内存中显示了两个字符串,它们的内容在框中,在框的旁边,您将看到每个字符串的地址。

当你在做if("some" == "some\0")的时候,你是在比较地址。它被翻译成if (0xdeadbeef == 0x0badcafe),这显然是错误的。
当您使用strcmp时,您将比较每个框的内容,直到您到达每个框中的\0。这就是为什么第二个测试返回true的原因。
如果您将第一个测试更改为if("some" == "some"),那么编译器may potentially会看到它们是相同的字符串,并且只存储它们一次。这意味着您的测试将转换为if (0x0badcafe == 0x0badcafe),这显然是正确的。
发布于 2011-07-16 12:10:35
"some" == "some\0" 按字符串的地址比较字符串文字。这些文字是存储在不同内存位置中的。所以总是使用false。
!strcmp("some","some\0")比较字符串的内容。因此,在这种情况下,"some\0"与"some"是相同的。所以true。
编辑:从你的评论中,你会问为什么"some" == "some"是true。这是因为大多数编译器都足够聪明,能够重用字符串文字(当它们存储在只读区域中时)。这就是它返回true的原因。
附注:在以下情况下,"some“不是以只读方式存储的:
char a[] = "some";发布于 2011-07-16 12:11:53
"some"的类型是const char*,所以当您比较"some"=="some\0"时,您是在比较两个const char*指针。由于它们可能不指向相同的内存位置,因此比较通常会失败。在第二种情况下,您使用的是strcmp,它通过遍历字符串中的单个字符来比较字符串。
https://stackoverflow.com/questions/6715247
复制相似问题