"join"=="join"?

underuwing 2009-10-07 09:50:31
由于c-串类型是字符指针,因此比较两个相同的c-串的时候,会因空间位置的不同而不同。(c++程序设计教程第二版(钱能),第78页)。
书中给出例子:
#include <iostream>
using namespace std;
int main(){
cout<<("join"=="join"?"":"not")<<"equal"<<endl;
system("pause");
}
我运行出来的结果是equal(vs2008)。而书中给的答案是not equal。
想请教达人,到底是equal还是not equal呢?
...全文
111 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
underuwing 2009-10-07
  • 打赏
  • 举报
回复
我明白了。 谢谢大家。 中国写技术书的太不严谨了。
shenshaobo_0 2009-10-07
  • 打赏
  • 举报
回复
期待最后的解答。。。
hyram 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 underuwing 的回复:]
引用 7 楼 thefirstz 的回复:
如果char *p1 = "join";  char *p2 = "join"; 那么p1,p2也会相同

但是char buf1[]="join", char buf2[]="join",为什么buf1和buf2 不相同呢?
[/Quote]
因为数组有内存空间,自己有自己的东西。而指针是用别人的东西,有可能大家都用同一个人的。
飞天御剑流 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 underuwing 的回复:]
由于c-串类型是字符指针,因此比较两个相同的c-串的时候,会因空间位置的不同而不同。(c++程序设计教程第二版(钱能),第78页)。
书中给出例子:
#include <iostream>
using namespace std;
int main(){
    cout < <("join"=="join"?"":"not") < <"equal" < <endl;
system("pause");
}
我运行出来的结果是equal(vs2008)。而书中给的答案是not equal。
想请教达人,到底是equal还是not equal呢?
[/Quote]
这个问题标准规定是未指定的,编译器可以只产生一个字符串字面量的唯一引用,也可以多个引用,标准的内容:

6.4.5 String literals

It is unspecified whether these arrays are distinct provided their elements have the appropriate values.

如果编译器选择了唯一引用,那么就是equal,如果多个引用,就是not equal的。如果钱能这本书告诉你not equal是唯一的答案,那么钱能就是低能。



但是char buf1[]="join", char buf2[]="join",为什么buf1和buf2 不相同呢?
---------------------------------------------------------------------
buf1和buf2是不同的数组对象,"join"在这里只作为初始化器。
liao05050075 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 underuwing 的回复:]
引用 7 楼 thefirstz 的回复:
如果char *p1 = "join";  char *p2 = "join"; 那么p1,p2也会相同

但是char buf1[]="join", char buf2[]="join",为什么buf1和buf2 不相同呢?
[/Quote]
p1,p2指向了同一个常量字符串,而buf1,buf2是两个不同字符数组,它们各自有自己的空间
underuwing 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 thefirstz 的回复:]
如果char *p1 = "join";  char *p2 = "join"; 那么p1,p2也会相同
[/Quote]
但是char buf1[]="join", char buf2[]="join",为什么buf1和buf2 不相同呢?
delphiwcdj 2009-10-07
  • 打赏
  • 举报
回复
我试过的是字符串常量在相同地址存放
昵称很不好取 2009-10-07
  • 打赏
  • 举报
回复
如果char *p1 = "join"; char *p2 = "join"; 那么p1,p2也会相同
xylicon 2009-10-07
  • 打赏
  • 举报
回复
由于c-串类型是字符指针,因此比较两个相同的c-串的时候,会因空间位置的不同而不同

说的很清楚了,你那里能够相等也许是因为编译器做了优化吧。但真正编码绝对不能这样比较的。
hemiya 2009-10-07
  • 打赏
  • 举报
回复
楼主的例子,编译器不一样,结果不一样.
字符串比较最好用strcmp,例子的写法就是书上说的是指针地址的比较.
underuwing 2009-10-07
  • 打赏
  • 举报
回复
书上还有两个例子
#include <iostream>
using namespace std;
int main(){
char* str1="hello";
char* str2="hello";
if(str1==str2)
cout<<"equal";
else
cout<<"not equal";
}
此例子书上说,not equal,我自己运行的是equal。
只有这个例子
#include <iostream>
using namespace std;
int main(){
char buf1[8]="hello";
char buf2[8]="hello";
if(buf1==buf2)
cout<<"equal";
else
cout<<"not equal";
}
我的结果和书上是一致的,都是not equal。
pcboyxhy 2009-10-07
  • 打赏
  • 举报
回复
中国作者写的技术书,喜欢凭想象给答案,或者自己创造标准
wendll 2009-10-07
  • 打赏
  • 举报
回复
书上说not equal?
个人认为,"join"做为字符串是存在静态存储内存区的,编译器为了方便是把两个常量放在一个地址。
"join" = "join"肯定是返回true的。

要是两个变量的话就结果不同了

char a[] = "join" ;
char b[] = "join" ;
cout <<(a==b?"":"not") <<"equal" <<endl;


字符串比较最好用strcmp吧
liao05050075 2009-10-07
  • 打赏
  • 举报
回复
这个要看具体编译器的实现了。
如果编译器有优化,将相同的常量字符串只保存一份的话,那就是equal了

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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