微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较 String if( "bonaparte"=="bonaparte" ) 这给出了真实的结果?

如何解决比较 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 中,我们比较了 s1s2 的基地址,显然它们会有所不同,因此输出为“假”。

在#2 中,我们将s 的基地址与常量字符串"bonaparte" 的基地址进行比较,显然它再次不同,因此输出为“False”。

然而,在 #3 中,我们比较了一个常量字符串 "bonaparte" 和另一个常量字符串 "bonaparte" 的基地址。我认为字符串名称是相同的,但它们在内存中的位置不同,因此,当我们尝试比较它们的基地址时,它们应该不同。但输出与上述(我的想法)相矛盾。

那么在第 3rd 案例中究竟发生了什么?

解决方法

在编译您的第三个代码示例时,编译器正在应用通常称为“字符串池化”的方法——也就是说,编译器发现两个(或多个)字符串文字是相同的,因此无法在运行时更改这些常量,通过仅生成数据的一个实例来优化代码,因此两个文字最终具有相同的地址。

大多数编译器默认执行此操作,但您可以禁用它。例如,在带有 MSVC 编译器的 Visual Studio 中,您可以设置 /GF- 选项以禁用它。有了这个集合,上面的代码将“Flase”(原文如此)作为输出(Reference)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。