所有机器和编译器上strcmp的结果是否相同?

时间:2014-01-06 03:46:32

标签: c string

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{   
    int n = strcmp("hello","help");
    printf("%d\n", n ) ;
    return 0;
}

结果:

  

-1

此程序的值是否必须在所有计算机或不同编译器上相同?

换句话说,当在不同的编译器或不同的机器上运行时,此返回值是否可以对同一程序采用不同的值?

3 个答案:

答案 0 :(得分:6)

它不必返回-1但它必须返回小于零的值(如果我们假设一个ASCII字符集),C99 draft standard部分7.21.4.2 strcmp函数表示:

  

strcmp函数返回一个大于,等于或小于零的整数,   因此,s1指向的字符串大于,等于或小于s2指向的字符串。

我可以让clang返回-1 live example with -O3 )或-4 live example with -O0 < / em>)取决于优化级别。

-O3甚至是-O1clang似乎没有向strcmp发出呼叫,只会执行以下操作:

movl    $-1, %esi

clang可能正在使用内置函数进行优化,类似于gcc's builtin,实际上我只能gcc发出对{{1}的调用在这种情况下使用strcmp

重要的是要注意标准并不保证字母字符的顺序,尽管它确实说数字字符应该是从-fno-builtin 字符集 3 说:

  

[...]在源和执行基本字符集中,   上述十进制数字列表中0后的每个字符的值应大于前一个值。[...]

因此,不同的字符集也会在不同的平台上产生不同的结果,我们可以很容易地看到比较ASCII and EBCDIC。在5.2.1中,大写字母在小写字母之前,但在ASCII中则相反。

答案 1 :(得分:2)

标准库仅保证您,0(正确比较),小于0(可能是-1-10)且大于0 (可以是110100)。

所以是的,你可能得到不同的价值观。

答案 2 :(得分:0)

返回值已由C标准定义。因此,所有编译器和不同的机器应该在相同的字符串上返回相同的值。