strcmp()为相同的字符串比较返回不同的值

时间:2015-10-12 22:40:40

标签: string-comparison strcmp man string.h

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,但我不明白为什么它们在这个例子中有所不同。

2 个答案:

答案 0 :(得分:4)

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

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

const

您还可以从编译器中查看汇编器输出(使用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,这会禁用此优化。使用此选项,原始代码将在两种情况下打印-9

答案 1 :(得分:3)

差异是由于strcmp的实现。只要它符合(< 0,0,> 0),它对开发者来说就不重要了。你不能依赖任何其他东西。如你所知,源代码可能是确定它应该是负数,然后随机生成一个负数以便让你离开。