a == b 比较的是地址,不是内容。
a和b可以指向两段不同的只读地址,只不过这两段内存区域存储的字符串内容都是"hello".
所以他们内容相同,但是地址却可以不同. 结果可能为NO.
但是,因为两个字符串常量内容相同,又是只读的,所以编译器可以进行优化,把这两个地址指向同一个区域,节省内存。所以这里的答案可以是YES.
相同的字符串常量是否指向同一个地址,由编译器来决定(见C++作者写的<<C++程序设计语言>>)
对于C语言, 见C语言标准ISO C99 (6.4.5/6节):
It is unspecified whether these arrays are distinct provided their elements have the appropriate values.
对于C++, 见ISO C++-98 (2.13.4/2节):
Whether all string literals are distinct(that is, are stored in non overlapping objects) is implementation defined.
可见无论C和C++,都规定相同内容的常量指针地址,未必指向相同地址。这个留给编译器,自由优化。
所以,可以肯定,用地址来比较指针,结果是不可靠的。根据C和C++的标准,这个代码的结果可能是YES,也可能是NO. 对gcc, 结果可能是YES, 对一些TurboC, 默认没有打开优化,结果可能是NO.
总之,无论是为了写出足够可靠的代码,还是为了可读性,都不要用地址进行比较。因为标准已经说明,这个结果是不确定的。
以上代码如果换成
char a[] = "hello";
char b[] = "hello";
结果就一定是NO
要想比较内容, 用strncmp.
#include <string.h>
#include <stdio.h>
main()
{
char *a = "hello";
char *b = "hello";
if(strncmp(a, b, strlen(a)+1) == 0)
printf("YES");
else
printf("NO");
}
温馨提示:答案为网友推荐,仅供参考