帮我分析下这个关于"=="的面试题

jessieque 2008-03-28 06:08:09
请判断下面的输出结果:

char str1[]="abc";
char str2[]="abc";

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

const char * str5="abc";
const char * str6="abc";

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

以上的输出结果为 0 0 1,请帮我分析下为什么前面两个不等,第三个是相等的,谢谢了! ^_^
...全文
322 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuBill 2008-04-02
  • 打赏
  • 举报
回复
顶18楼
paidfighting 2008-04-02
  • 打赏
  • 举报
回复
up,18楼正解
  • 打赏
  • 举报
回复
我偶的代码
int i=0;
char str1[]="abc";
char str2[]="abc";

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

const char * str5="abc";
const char * str6="abc";
if(i==(str1==str2))
{
MessageBox(_T("NO"),0,0);
}
if(i==(str3==str4))
{
MessageBox(_T("NO"),0,0);
}
if(i==(str5==str6))
{
MessageBox(_T("NO"),0,0);
}
结果都弹出NO
  • 打赏
  • 举报
回复

我测试都是0
不想低调 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 oo 的回复:]
谁把我们公司的笔试题目搞上来了?
[/Quote]
什么公司啊?!
visame 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Oversense 的回复:]
这个题目很无聊,和实现有关系
[/Quote]
的确,和实现有关。最后一个是否输出1并不是确定的。
sungodyy 2008-04-02
  • 打赏
  • 举报
回复
比较倾向于26楼的解释!
tim8880878 2008-04-02
  • 打赏
  • 举报
回复
看了18楼的代码:
定义
const char * str5="abc";
const char * str6="abc";
输出
cout<<&str5 <<" "<<&str6<<endl;
我的理解str5本来就是个指针变量,输出的时候用的是&str5,
在这里输出的应该是指针变量的所占的内存的地址,而不是该指针所指向的地址?
不知道这样理解对不对?
忘高手解答....
谢谢
newserves 2008-04-02
  • 打赏
  • 举报
回复
18楼正解
donwmufromdying 2008-04-02
  • 打赏
  • 举报
回复
这个问题很简单,头两个比较的是地址。
abupie 2008-03-29
  • 打赏
  • 举报
回复
char str1[]="abc";
char str2[]="abc";

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

const char * str5="abc";
const char * str6="abc";


比较的内存地址。
常字符串是同一地址。
const char * str5="abc";
const char * str6="abc";
只是把str5,str6指向同一地址,不会重新分配空间的。

char str1[]="abc";
char str2[]="abc";

const char str3[]="abc";
const char str4[]="abc";
这些都会重新分配空间。
yljhs 2008-03-29
  • 打赏
  • 举报
回复
#include<windows.h>
#include <iostream.h>
void nextone();
void first();
int main()
{
//第一个演示
first();
//另一个演示
nextone();
return 0;
}

void first()
{
char str1[]="abc";
char str2[]="abc";

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

const char * str5="abc";
const char * str6="abc";

//显示地址
cout <<&str1 << " " <<&str2 <<endl;
cout <<&str3 << " " <<&str4 <<endl;
cout <<&str5 << " " <<&str6 <<endl;

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

void nextone()
{
char str1[]="abc";
char str2[]="abc";

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

char * str5="abc";
char * str6="abc";

//显示地址
cout <<&str1 << " " <<&str2 <<endl;
cout <<&str3 << " " <<&str4 <<endl;
cout <<&str5 << " " <<&str6 <<endl;

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

}

结果显示:
0x0012FF28 0x0012FF24
0x0012FF20 0x0012FF1C
0x0012FF18 0x0012FF14
0
0
1
0x0012FF28 0x0012FF24
0x0012FF20 0x0012FF1C
0x0012FF18 0x0012FF14
0
0
1
Press any key to continue

说明,const 对这个测试的结果没影响;str1==str2 和 str3==str4 是比内存地址, 而str5==str6是两个字指针比较指向的字符内容。
silendream 2008-03-29
  • 打赏
  • 举报
回复
恩 学习
fishly_0 2008-03-29
  • 打赏
  • 举报
回复
mark
barenx 2008-03-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 jessieque 的帖子:]
请判断下面的输出结果:

char str1[]="abc";
char str2[]="abc";

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

const char * str5="abc";
const char * str6="abc";

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

以上的输出结果为 0 0 1,请帮我分析下为什么前面两个不等,第三个是相等的,谢谢了! ^_^
[/Quote]

str3==str4==str5==str6
编译器都会优化字符串指向同样的静态段,str1,str2是动态分配的所以不一样
oo 2008-03-29
  • 打赏
  • 举报
回复
谁把我们公司的笔试题目搞上来了?
jessieque 2008-03-29
  • 打赏
  • 举报
回复
我在修改下,添加点代码,请大侠帮我分析一下,谢谢了

char * str7="abc";
char * str8="abc";
cout<<(str7==str8)<<endl; //1

cout<<"str1==str3? "<<(str1==str3)<<endl; //0

cout<<"str5==str7? "<<(str5==str7)<<endl; //1

1.str7和str8为字符变量,所以两个都应该重新分配,所以地址应该不一样,为什么"str7==str8"为1 ?
2.为什么常量指针str5和变量str7的地址是一样的,即(str5==str7)为1 ?
Oversense 2008-03-28
  • 打赏
  • 举报
回复
这个题目很无聊,和实现有关系
ttkk_2007 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jessieque 的回复:]
谢谢7楼的答复,很清楚,明白了!
在追问2个问题,

1。根据1楼的回答,前两个cout中==比较的就是两边的地址(str1和str2,str3和str4),而不是字符串了?
2.那我在把输出改改:
cout < <(str1=="abc") < <endl;
cout < <(str3=="abc") < <endl;
cout < <(str5=="abc") < <endl;
这样,3个cout比较中,每个==右边的"abc" 还是str5和str6所指向的常量存储区中的"abc"吗?
[/Quote]
1.比的是地址
2.是
yuannan 2008-03-28
  • 打赏
  • 举报
回复
现在只是从str1,str3,str5
取值和“abc”比较而已
加载更多回复(9)

64,680

社区成员

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

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