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

时间:2011-07-16 04:06:36

标签: c++ string comparison

c ++中"some" == "some\0"strcmp("some","some\0")之间有什么区别?

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

3 个答案:

答案 0 :(得分:9)

"some" == "some\0" 

将字符串文字与其地址进行比较。这些文字存储在不同的内存位置。总是false

!strcmp("some","some\0")

比较字符串的内容。因此,在该上下文中"some\0""some"相同。所以true

修改:根据您的评论,您会问"some" == "some"true的原因。这是因为大多数编译器足够聪明,可以重用字符串文字(当它们存储在只读区域时)。这就是它返回true的原因。

P.S。在下面的情况下,“some”不会以只读方式存储:

char a[] = "some";

答案 1 :(得分:5)

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

string content and addresses

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

当您使用strcmp时,您需要比较每个框的内容,直到每个框中的\0为止。这就是第二次测试返回真实的原因。

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

答案 2 :(得分:2)

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