【每日一问】这段程序到底输出什么?

sk_sakula 2011-04-08 03:12:34

if("test"=="test")
{
cout<<"Yes"<<endl;
}
else
{
cout<<"NO"<<endl;
}

有人说输出NO,理由是“test”为常量字符串,他们在内存中的地址不同,所以输出NO,但是我的实际代码输出的怎么是Yes?
...全文
215 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
北岛 2011-06-08
  • 打赏
  • 举报
回复
学习学习!!嗯!
zhangquangood 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferisnotsatan 的回复:]

答案是yes,这两地址也是一样的。字符串常量。
下面的才是No
C/C++ code

char sz1[] = "test";
char sz2[] = "test";
if(sz1=="test")
{
cout<<"Yes"<<endl;
}
else
{
cout<<"NO"<<endl;
……
[/Quote]

这应该是正解,全凭感觉,,,呵呵
hellboy198502 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]
字符串常量在常量区里,只有一份
[/Quote]

顶正解。
chengzhe 2011-04-08
  • 打赏
  • 举报
回复
我错了 勉强可以编译
chengzhe 2011-04-08
  • 打赏
  • 举报
回复
个人感觉编译有问题
kxxk1963 2011-04-08
  • 打赏
  • 举报
回复
牛啊我什么时候达到这水平
qbwjly 2011-04-08
  • 打赏
  • 举报
回复
字符串与字符串比较的是内容,不是地址
zongmaokeke 2011-04-08
  • 打赏
  • 举报
回复
确实是YES,这是编译器的优化,字符串存放在常量区而不是栈中,编译器为了更好的利用内存(减少内存开销),就将完全相同的字符串只保留一份,在vs的编译器下都是这样的,在别的编译器下就不好说了,这个结果是编译器相关的。在字符串比较中“=”比较的是地址是否相同,strcpy比较的是内容是否相同。
sk_sakula 2011-04-08
  • 打赏
  • 举报
回复
lucifer说的是对的,字符串在常量区只有一个地址,所以上面比较的得出的是 YES
liubo060807 2011-04-08
  • 打赏
  • 举报
回复
两个"test"都是放在静态存储区域,编译时完毕后在数据段的地址是一样的。

char *a = "test";
char *b = "test";

ab的地址是一样的的。


char a[] = "test";
char b[] = "test";


ab地址不一样
天亮后说晚安 2011-04-08
  • 打赏
  • 举报
回复
比较地址.
字符串常量在静态分配区。同一个字符串只有一个地址。
luciferisnotsatan 2011-04-08
  • 打赏
  • 举报
回复
比较确实是比较地址,下面是汇编
    if(sz1=="test")
0041A3B3 lea eax,[sz1]
0041A3B6 cmp eax,offset string "test" (422AF4h)
0041A3BB jne main+0DAh (41A3EAh)


if(sz1==sz2)
0041A415 lea eax,[sz1]
0041A418 lea ecx,[sz2]
0041A41B cmp eax,ecx
0041A41D jne main+13Ch (41A44Ch)


if("test"=="test")
0041A477 mov eax,offset string "test" (422AF4h)
0041A47C cmp eax,offset string "test" (422AF4h)
0041A481 jne main+1A0h (41A4B0h)



luciferisnotsatan 2011-04-08
  • 打赏
  • 举报
回复
字符串常量在常量区里,只有一份
luciferisnotsatan 2011-04-08
  • 打赏
  • 举报
回复
答案是yes,这两地址也是一样的。字符串常量。
下面的才是No

char sz1[] = "test";
char sz2[] = "test";
if(sz1=="test")
{
cout<<"Yes"<<endl;
}
else
{
cout<<"NO"<<endl;
}
if(sz1==sz2)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"NO"<<endl;
}
sxqinge 2011-04-08
  • 打赏
  • 举报
回复
应该是YES,你用两个字符串这样进行比较的话,它会逐个进行匹配,完全一致就认为相同,好像和地址没多大关系吧?但是很少这样使用,就strcmp不是很好嘛
calven_2521 2011-04-08
  • 打赏
  • 举报
回复
你试试strcmp("test","test")
sk_sakula 2011-04-08
  • 打赏
  • 举报
回复
恩,书上也有讲到这个字符串比较用strcmp
yuppy 2011-04-08
  • 打赏
  • 举报
回复
我只知道java里面字符串怎么也不可以直接比较...

问题有点2把
bdmh 2011-04-08
  • 打赏
  • 举报
回复
字符串比较,用strcmp

64,646

社区成员

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

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