字符串数组的比较

sdyqingdao 2007-01-11 03:35:38
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";

cout << boolalpha << ( str1==str2 ) << endl;
cout << boolalpha << ( str3==str4 ) << endl;
cout << boolalpha << ( str5==str6 ) << endl;

请问为什么str1!=tr2, str3!=str4 and str5 == str6s?
...全文
520 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiveyes 2007-01-12
  • 打赏
  • 举报
回复
没的说了,up
fengzar1984 2007-01-12
  • 打赏
  • 举报
回复
大家都说得对,又好.
只能够顶了.
ming4098 2007-01-12
  • 打赏
  • 举报
回复
学习
不想低调 2007-01-12
  • 打赏
  • 举报
回复
都说完了,只能jf了
zhousqy 2007-01-11
  • 打赏
  • 举报
回复
- -蟲子都講了
重復一下:
“==”是比較的2个字符串的地址
strcmp可以用來比較字符串的内容
zhhonghui 2007-01-11
  • 打赏
  • 举报
回复
char str1[] = "abc";
char str2[] = "abc";
分配两个数组空间,存放的内容为"abc",str1和tr2分别表示两个数组空间的首地址,当然不同。

const char str3[] = "abc";
const char str4[] = "abc";
原因和str1,str2相同。

至于第三个也不是很难理解,编译器认定str5和str6指向的是同一个地址,且不会改变(const),所以编译器使用引用记数(在这里也没什么意义,还是因为const)的方法做了优化,说明那个内存空间被使用了两次,从而节省了重复开辟内存所耗费的时间和空间。
ybt631 2007-01-11
  • 打赏
  • 举报
回复
你比较的只是指针哦。。
真正的比较字符串必须用strcmp
jixingzhong 2007-01-11
  • 打赏
  • 举报
回复
cout << boolalpha << ( str1==str2 ) << endl;
cout << boolalpha << ( str3==str4 ) << endl;
cout << boolalpha << ( str5==str6 ) << endl;
==》
cout << boolalpha << ( str1==str2 ) << endl;
cout << boolalpha << ( str3==str4 ) << endl;
cout << boolalpha << ( str5==str6 ) << endl;
cout << boolalpha << strcmp(str1, str2) << endl; //比较字符串内容, 用strcmp函数
cout << boolalpha << strcmp(str3, str4) << endl;
cout << boolalpha << strcmp(str5, str6) << endl;
jixingzhong 2007-01-11
  • 打赏
  • 举报
回复
strX==strY

这样的比较,
实际上不是比较 字符串的内容,
而是比较了 字符串的 首地址, 也就是他们的指针!!

既然是比较地址,
那么显然 str1!=tr2, str3!=str4, 因为它们都是相对独立的 栈数组,
都有自己的空间, 那么比较地址自然就是不一样的。

str5 == str6
这个要看具体情况,
一种, 环境设置了 编译优化,
那么对于相同的常量, 环境将对其进行优化, 只保存一份内容,
使用不同的指针引用该内容,
这样, 得到的结果就是 str5 == str6, 因为它们都指向了 同一份内存内容;
另外一种情况,
如果不选择优化,
那么 和栈数组一样, str5 != str6
todototry 2007-01-11
  • 打赏
  • 举报
回复
str5 == str6
这属于编译器优化技术
不属于语言语法语义的
todototry 2007-01-11
  • 打赏
  • 举报
回复
用strcmp()函数进行比较
数组名的类型,编译器解释成指向数组首元素的指针,你比较的是指针的值,也就是地址之间的大小,str1,str2,str3,str4都是栈上分配的不同的内存区域,所以地址不同,而str5,str6都是指向常量的指针,为了节省内存消耗,编译器对静态存储区的文本常量进行了“常量折叠”,相同常量只存一份,所以二者地址的相同,指向静态存储区的同一块内存的地址
nicewong 2007-01-11
  • 打赏
  • 举报
回复
char str1[] = "abc";
char str2[] = "abc";

const char str3[] = "abc";
const char str4[] = "abc";

都是分别开辟开辟自己的空间储存abc ,他们的地址不一样 ,所以str1!=tr2, str3!=str4

而str5 str6都指向同一abc首地址,所以相等。
HappyTree 2007-01-11
  • 打赏
  • 举报
回复
char str1[] = "abc";
char str2[] = "abc";
str1和str2都是字符数组,它们在栈上申请空间,每个数组都是4个字节,它们各指向自己的数组,当然不相等。

const char str3[] = "abc";
const char str4[] = "abc";
理由同上

const char* str5 = "abc";
const char* str6 = "abc";
str5和str6指向的都是常量"abc","abc"在常量区,很多编译器对于内容一样的字符串常量,只保留一份,因此这里str5和str6在大多数编译器上都是相等的。但这不是绝对的,如果编译器作者把两个"abc"保存在常量区的不同位置,显然str5和str6也不会相等。

字符串内容的比较使用strncmp()或strcmp()。



fxc123 2007-01-11
  • 打赏
  • 举报
回复
学习,一般的机器都是str5==str6么?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧