代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n = strcmp("hello","help");
printf("%d\n", n ) ;
return 0;
}
结果:
-1
此程序的值是否必须在所有计算机或不同编译器上相同?
换句话说,当在不同的编译器或不同的机器上运行时,此返回值是否可以对同一程序采用不同的值?
答案 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
甚至是-O1
,clang
似乎没有向strcmp
发出呼叫,只会执行以下操作:
movl $-1, %esi
clang
可能正在使用内置函数进行优化,类似于gcc's builtin,实际上我只能gcc
发出对{{1}的调用在这种情况下使用strcmp
。
重要的是要注意标准并不保证字母字符的顺序,尽管它确实说数字字符应该是从-fno-builtin
字符集段 3 < em>说:
[...]在源和执行基本字符集中, 上述十进制数字列表中0后的每个字符的值应大于前一个值。[...]
因此,不同的字符集也会在不同的平台上产生不同的结果,我们可以很容易地看到比较ASCII and EBCDIC。在5.2.1
中,大写字母在小写字母之前,但在ASCII
中则相反。
答案 1 :(得分:2)
标准库仅保证您,0
(正确比较),小于0
(可能是-1
,-10
)且大于0
(可以是1
,10
,100
)。
所以是的,你可能得到不同的价值观。
答案 2 :(得分:0)
返回值已由C标准定义。因此,所有编译器和不同的机器应该在相同的字符串上返回相同的值。