strcmp的结果在所有机器和编译器上都是一样的吗?

strcmp的结果在所有机器和编译器上都是一样的吗?,c,string,C,String,代码: #包括 #包括 #包括 int main() { int n=strcmp(“你好”,“帮助”); printf(“%d\n”,n); 返回0; } 结果: -一, 在所有计算机或不同的编译器上,此程序的值必须相同吗 换句话说,当在不同的编译器或不同的机器上运行时,同一程序的返回值是否会具有不同的值 返回值已由C标准定义。因此,所有编译器和不同的机器都应该在相同的字符串上返回相同的值。它不必返回-1,但它必须返回小于零的值(如果我们假设一个ASCII字符集),7.21.4.2节中

代码:

#包括
#包括
#包括
int main()
{   
int n=strcmp(“你好”,“帮助”);
printf(“%d\n”,n);
返回0;
}
结果:

-一,

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


换句话说,当在不同的编译器或不同的机器上运行时,同一程序的返回值是否会具有不同的值

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

它不必返回
-1
,但它必须返回小于零的值(如果我们假设一个ASCII字符集),
7.21.4.2
节中的strcmp函数说:

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

我可以让
clang
根据优化级别返回
-1
()或
-4
()

使用
-O3
或甚至
-O1
时,看起来
clang
根本没有发出对
strcmp
的调用,它只会执行以下操作:

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


int main()
{   
    int n = strcmp("hello","help");
    printf("%d\n", n ) ;
    return 0;
}
clang
可能在这里使用内置函数进行优化,类似于,事实上,我只能让
gcc
发出对
strcmp
的调用,在这种情况下,使用
-fno-builtin

重要注意事项:本标准不保证字母字符的顺序,尽管它确实规定数字字符应按第
5.2.1节
字符集第3段规定的顺序排列:

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


所以不同的字符集也会在不同的平台上产生不同的结果,我们可以很容易地看到比较。在
ASCII
中,大写字母在小写字母之前,但在
EBCDIC
中则相反标准库仅保证
0
(正确比较),小于
0
(可以是
-1
-10
),大于
0
(可以是
1
10
100


因此,您可能会得到不同的值。

@MitchWheat该标准只保证结果的符号,而不是其值。允许实现返回-6或-45。请查看@MitchWheat:C99标准,7.21.4.2(strcmp函数)<代码> > StrcMP函数返回一个大于、等于或小于零的整数,相应地,S1指向的字符串大于、等于或小于S2指向的字符串。——对于C99之前的任何东西,查询相应的标准。它应该到处返回相同的东西,但应该考虑的事情是I。s指定的内容(
0
),而不是精确的值。这实际上是一个非常好的问题,一开始并不明显。这不是列出的问题的重复,而推荐或查找工具的密切原因,库根本没有任何意义。很好的答案,但strcmp返回的内容并不取决于编译器,而是取决于
libc
。@mafso这是假设调用了strcmp,这与任何优化都没有关系。我猜这是
gcc
。我想说的是,我猜它一定类似于
gcc
内置,但我找不到一个
clangg
文档来涵盖这一点。既然你提到了它,确切地说,该标准是否规定这些特定字符串的结果必须小于零?它说当第一个字符串小于第二个字符串时返回小于零,但它在哪里定义了如何比较字符串,或者甚至是
'l'
小于
'p'
?我们是否按照惯例认为字母按字母顺序排列我只看到它定义了数字字符的相对顺序(在5.2.1/3中)。
movl    $-1, %esi