strcmp() return 相同字符串比较的不同值

strcmp() return different values for same string comparisons

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

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

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

不同之处在于 strcmp 的实现。只要它符合 (<0, 0, >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