为什么C==对于相等的字符串返回true?

为什么C==对于相等的字符串返回true?,c,C,为什么这在C中工作?当字符串相等时,它返回true?怎样例如,它在Java中不起作用,因为指针是比较的。C99的基本原理是关于字符串文本的(强调我的): “此规范允许实现共享具有相同文本的字符串副本,将字符串文本放入只读内存,并执行某些优化” 它是允许的,但不是必需的,因此不同的实现或相同的实现(如果程序稍有不同)的结果可能不同。我认为使用“if”(“string1”==“string2”)比较字符串是将指针与C中的字符串文字相比较。您可以参考以下帖子:- 在上述主功能中有两个if块。如果将“s

为什么这在C中工作?当字符串相等时,它返回true?怎样例如,它在Java中不起作用,因为指针是比较的。

C99的基本原理是关于字符串文本的(强调我的):

“此规范允许实现共享具有相同文本的字符串副本,将字符串文本放入只读内存,并执行某些优化”


它是允许的,但不是必需的,因此不同的实现或相同的实现(如果程序稍有不同)的结果可能不同。

我认为使用“if”(“string1”==“string2”)比较字符串是将指针与C中的字符串文字相比较。您可以参考以下帖子:-

在上述主功能中有两个if块。如果将“string1”与自身进行比较,则其中一个选项将导致TRUE。第二个是比较“string1”和“string2”,这将导致错误。如果将指针分配给字符串文本并打印它们的地址,您将能够看到为什么在第一个If块中获得真值,在第二个If块中获得假值。输出结果如下:-

int main() {

    if( "string1" == "string1" ) {
        printf("Strings are equal\n");
    } else {
        printf("Strings are not equal\n");
    }

    if( "string1" == "string2" ) {
        printf("Strings are equal\n");
    } else {
        printf("Strings are not equal\n");
    }

    char* s1 = "string1";
    char* s2 = "string2";

    printf("%s = %p %s = %p\n", s1, s1, s2, s2);
    return(0);
}

请参阅@ShafikYaghmour:此链接导致相同字符串的情况。。。这里的情况并非如此……提问者特别询问,为什么对于相等的字符串它返回true。当然,对于不同的字符串,它必须返回false,或者某个字符串严重损坏。@Amesshiel我读到
当字符串相等时,它返回true,我没有注意到示例中实际显示了不同的内容。是的,但正如您所看到的,这些字符串是不同的。。。我认为这不是合适的解释。@Amesshel我回答的是“字符串相等时返回true?”当字符串文本不同时,结果总是
0
。他说“为什么这样做?”。。。我理解“为什么它返回true?”但可能不是这样。@Amesshiel关于“为什么它在C中工作”我猜他的意思是为什么它有效,答案是因为字符串文字被转换为指针值,您可以使用指针值作为
=
运算符的操作数。现在,当字符串文本与示例中的不同时,使用
=
是有效的,但结果总是
0
。他必须准确地告诉我们他想知道什么。
int main() {

    if( "string1" == "string1" ) {
        printf("Strings are equal\n");
    } else {
        printf("Strings are not equal\n");
    }

    if( "string1" == "string2" ) {
        printf("Strings are equal\n");
    } else {
        printf("Strings are not equal\n");
    }

    char* s1 = "string1";
    char* s2 = "string2";

    printf("%s = %p %s = %p\n", s1, s1, s2, s2);
    return(0);
}
GAGUPTA2-M-40UT:Desktop gagupta2$ ./a.out 
Strings are equal
Strings are not equal
string1 = 0x105f6ef50 string2 = 0x105f6ef82