如何解决比较 String if( "bonaparte"=="bonaparte" ) 这给出了真实的结果?
注意:我知道我可以通过使用 strcmp()
来完成这些事情,但我只是尝试使用等于 ==
运算符。
代码 1:
#include<stdio.h>
int main()
{
char s1[]="bonaparte",s2[]="bonaparte";
if(s1==s2)
{
printf("True");
}
else
{
printf("Flase");
}
}
输出:
False
代码 2:
#include<stdio.h>
int main()
{
char s[]="bonaparte";
if(s=="bonaparte")
{
printf("True");
}
else
{
printf("Flase");
}
}
输出:
False
代码 3:
#include<stdio.h>
int main()
{
if("bonaparte"=="bonaparte")
{
printf("True");
}
else
{
printf("Flase");
}
}
输出:
True
因此,在 #1 中,我们比较了 s1
和 s2
的基地址,显然它们会有所不同,因此输出为“假”。
在#2 中,我们将s
的基地址与常量字符串"bonaparte"
的基地址进行比较,显然它再次不同,因此输出为“False”。
然而,在 #3 中,我们比较了一个常量字符串 "bonaparte"
和另一个常量字符串 "bonaparte"
的基地址。我认为字符串名称是相同的,但它们在内存中的位置不同,因此,当我们尝试比较它们的基地址时,它们应该不同。但输出与上述(我的想法)相矛盾。
那么在第 3rd 案例中究竟发生了什么?
解决方法
在编译您的第三个代码示例时,编译器正在应用通常称为“字符串池化”的方法——也就是说,编译器发现两个(或多个)字符串文字是相同的,因此无法在运行时更改这些常量,通过仅生成数据的一个实例来优化代码,因此两个文字最终具有相同的地址。
大多数编译器默认执行此操作,但您可以禁用它。例如,在带有 MSVC 编译器的 Visual Studio 中,您可以设置 /GF-
选项以禁用它。有了这个集合,上面的代码将“Flase”(原文如此)作为输出(Reference)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。