【发布时间】:2019-07-09 16:37:02
【问题描述】:
我想知道为什么strcmp() 在同一个函数中多次使用会返回不同的值。下面是程序。第一种情况我知道它为什么打印-6。但是在第二种情况下,为什么它打印-1?
#include<stdio.h>
#include<string.h>
int main()
{
char a[10] = "aa";
char b[10] = "ag";
printf("%d\n",strcmp(a, b));
printf("%d\n",strcmp("aa","ag"));
return 0;
}
它产生的输出如下
[sxxxx@bhlingxxx test]$ gcc -Wall t51.c
[sxxxx@bhlingxxx test]$ ./a.out
-6
-1
为什么第二个strcmp()的输出是-1?是编译器在这里玩吗?如果是这样,它的具体优化是什么?
【问题讨论】:
-
看看生成的机器代码,看看它到底做了什么,以及编译器是如何翻译你的源代码的。
-
你不应该关心它返回的确切值(除非它是 0);仅当它小于、等于或大于 0 时。
-
如果将这些文字分配给指针(而不是 char 数组),结果将与 char 数组的情况相同,即
char* c="aa", *d = "ag";,将产生相同的-6。 -
@Shawn:C 标准仅指定结果的符号这一事实并不意味着您不应该关心数量级。遵守 C 标准只是软件工程的一小部分,而好奇心是一个很大的动力,有助于学习编译器的工作原理,加深对语义的理解等等。关心和询问是好的和有价值的,因为获得的知识可以导致编写更好优化的代码,不太可能包含错误等等。知识是宝贵的,人们应该关心。
-
@EricPostpischil 然而,对您的系统究竟是如何工作的好奇可能会导致您探索和利用实际上特定于您的系统的小细节的危险,而这些细节并不在其他系统上产生相同的结果。我认为,重要的是标准所说的应该发生的事情。只要您知道这一点,您就可以探索不同的系统是如何实现它的,但如果您不这样做,您最终可能会陷入未定义行为的错误方面。