c ++中"some" == "some\0"
和strcmp("some","some\0")
之间有什么区别?
为什么if("some" == "some\0")
会返回false
而if(!strcmp("some","some\0"))
会返回true
?
答案 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)
请参见下图。它在内存中显示两个字符串,它们的内容在框中,在框旁边,您将看到每个字符串的地址。
当你正在进行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
,它通过遍历字符串中的单个字符来比较字符串。