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,但我不明白为什么它们在这个例子中有所不同。
答案 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),它对开发者来说就不重要了。你不能依赖任何其他东西。如你所知,源代码可能是确定它应该是负数,然后随机生成一个负数以便让你离开。