【问题标题】:strcmp() return different values for same string comparisons [duplicate]strcmp()为相同的字符串比较返回不同的值[重复]
【发布时间】:2016-01-10 12:51:33
【问题描述】:
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,但我不明白为什么在这个示例中它们不同。

【问题讨论】:

标签: string-comparison strcmp manpage string.h


【解决方案1】:

我假设您在编译时使用的是 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

【讨论】:

  • 我认为“不能”部分是错误的,它确实是“不符合给定的优化设置”。
【解决方案2】:

区别在于strcmp的实现。只要它符合 (0),对开发人员来说应该无关紧要。你不能依赖其他任何东西。据你所知,源代码可能会确定它应该是负数,并随机生成一个负数来让你失望。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多