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

Sur*_*uri 1 c++ string comparison

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

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

iam*_*ind 9

"some" == "some\0" 
Run Code Online (Sandbox Code Playgroud)

比较字符串文字的地址.这些文字存储在不同的内存位置.所以永远false.

!strcmp("some","some\0")
Run Code Online (Sandbox Code Playgroud)

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

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

PS在下面的情况下,"some"不会以只读方式存储:

char a[] = "some";
Run Code Online (Sandbox Code Playgroud)

  • 另一个有趣的观点是,有时"some"=="some"`将返回true,但这只是因为字符串常量被重用. (2认同)

Mih*_*eac 5

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

字符串内容和地址

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

使用时strcmp,比较每个框的内容,直到达到每个框的内容\0.这就是第二次测试返回true的原因.

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