gpt4 book ai didi

string-comparison - strcmp() 对于相同字符串比较返回不同的值

转载 作者:行者123 更新时间:2023-11-30 17:00:19 24 4
gpt4 key购买 nike

char s1[] = "0";
char s2[] = "9";
printf("%d\n", strcmp(s1, s2)); // Prints -9
printf("%d\n", strcmp("0", "9")); // Prints -1

为什么strcmp接收到相同的参数时返回不同的值?

这些值仍然合法,因为 strcmp 的手册页说 strcmp 的返回值可以小于、大于或等于 0,但我不明白为什么它们在本例中不同。

最佳答案

我假设你编译时使用的是GCC,我在4.8.4上尝试过。这里的技巧是 GCC 理解某些标准库函数的语义(strcmp 是其中之一)。在您的情况下,编译器将完全消除第二个 strcmp 调用,因为它知道 strcmp 给出的字符串常量 "0""9" 将为负数,并且将使用标准兼容值 (-1) 而不是进行调用。它无法对第一次调用执行相同的操作,因为 s1s2 可能已在内存中发生更改(想象一下中断或多个线程等)。

您可以做一个实验来验证这一点。将 const 限定符添加到数组中,让 GCC 知道它们无法更改:

const char s1[] = "0";
const char s2[] = "9";
printf("%d\n", strcmp(s1, s2)); // Now this will print -1 as well
printf("%d\n", strcmp("0", "9")); // Prints -1

您还可以查看编译器的汇编程序输出(使用 -S 标志)。

但是,最好的检查方法是使用 -fno-builtin,它会禁用此优化。使用此选项,您的原始代码在两种情况下都会打印 -9

关于string-comparison - strcmp() 对于相同字符串比较返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37695188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com