初学C语言,下面这个程序有点模糊,高手分析一下下面的代码:说明一下原因....

#include<stdio.h>
main()
{
char *a = "hello";
char *b = "hello";
if(a==b)
printf("YES");
else
printf("NO");
}

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");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-30
char *a = "hello"; //这样的"hello"叫做字符串常量,保存在常量区,并且相同的字符串常量只有一份,也就是说 a和b指向同一个地方了,所以输出是yes

即使是这样也一样,"hello"还是一份
#include<stdio.h>
char *a = "hello";
int main()
{
char *b = "hello";
if(a==b)
printf("YES");
else
printf("NO");
}
第2个回答  2012-04-30
if(a==b)
在数组比较的时候,不能这么比较,
只能一个一个的比较
字符串有几个系统的函数可以用
strcmp这个是比较字符串的

你的程序中,ab是指针,
a==b这个是ab指针比较,当然是内存空间的地址,一般来说不可能分配在一个地方,所以只能打出no
第3个回答  2012-04-30
逻辑上,a,b均为两个地址,指向2个“hello”字符串的地址,是2个,应该不同;编译器在编译程序的时候,按大部分编译器的默认设置,在分配给这两个“常量”字符串分配空间存储的时候,发现内容是相等的,所以进行了优化,共用了一个存贮空间,共享了一个地址,所以a、b是相等的。
结果是yes
说明: 1. 输出yes的意思是,a b的地址相等,并不是说a b各自指向的字符串内容相等,如果比较字符串需要用
strncmp(a, b, strlen(a)+1) == 0

2 。编程中,不建议进行类似编写,因为不确定因素太多了,因为机器和编译器设置的参数的不同,可能会导致不同的结果。另外编程逻辑上也存在问题。
第4个回答  2012-04-30
a值为hello,b值为hello,a=b成立,故输出yes
相似回答