注册 登录
编程论坛 C++教室

一道淘宝的笔试题_请大吓请点!

vincentcity 发布于 2008-10-23 22:51, 3354 次点击
#include<iostream.h>

void main()
{
    char str1[]="abc";
    char str2[]="abc";
//    char *str = str1;
    const char str3[]="abc";
    const char str4[]="abc";
    const char *str5="abc";
    const char *str6="abc";
    if (str1==str2) cout<<"TRUE"<<endl;  
    else cout<<"FALSE"<<endl;           //FALSE;

    if (str3==str4) cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;        // FALSE;
    
   if (str5==str6) cout<<"TRUE"<<endl;   
    else cout<<"FALSE"<<endl;           //TRUE

}

为什么输出会是假呢?
20 回复
#2
blueboy820062008-10-23 23:15
要知道数组名可是地址!
明明是两个数组,虽然内容是一样的.但地址是绝对不会等的!
#3
blueboy820062008-10-23 23:16
str5和str6就不同了...都指向同一个地址...相等....
#4
blueboy820062008-10-23 23:17
这真是淘宝的笔试题吗?
没什么难度,就是迷惑那些基础不牢的....
#5
tjxix2008-10-24 10:36
最后一个为什么会是TRUE啊?
为什么没有把str5和str6那两句里的"abc"当作不同的字符串而分别赋予不同的地址?按书上说的应该是当作内容一样,但地址不同的两个字符串啊。

我在这个代码里加了几句,用dev c++编译:

int main()
{
    char str1[]="abc";
    char str2[]="abc";
//    char *str = str1;
    const char str3[]="abc";
    const char str4[]="abc";
    const char *str5="abc";
    const char *str6="abc";
//增加的地方:
    char *str7="abc";
    char *str8="abc";

   
    if (str1==str2) cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;           //FALSE;

    if (str3==str4) cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;        // FALSE;

   if (str5==str6) cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;           //TRUE
//增加的地方:
    if (str7==str8) cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;           
   
       if ("abc"=="abc") cout<<"TRUE"<<endl;
    else cout<<"FALSE"<<endl;           //TRUE

}

最后的结果是:

FALSE
FALSE
TRUE
TRUE
TRUE

谁能来解释一下最后三个TRUE,编译器为什么没有把字符串"abc"区别开来?
谢谢!


[[it] 本帖最后由 tjxix 于 2008-10-24 10:38 编辑 [/it]]
#6
newyj2008-10-24 11:35
首先 解释一下最后一个ture 因为字符串常量 就是代表它们的首地址
倒数第二个 和 第三个 char *str7="abc"和const char *str5="abc" 都是字符串常量也就是 说 不能被修改的
它们的地址 也就是一样的
虽然数组名是地址 那这也是 这个数组的首地址 只能指向这个数组
所以不同的数组名 只能指向自己的数组 所以它们的地址是不一样的
#7
sunkaidong2008-10-24 11:41
现在笔试题都是考基础。。很少考很难的
#8
maibarry2008-10-24 12:02
C语言忘记好了。现在的语言都不用指针了。
#9
lockhawk2008-10-24 14:31
声明一个数组的时候等于声明了一个独立空间。虽然 str1和str2 str3和str4 贮存的内容相同,但不是同一个空间,所以他们的地址不同。str5和str6是指针,两个指针可以同时指向同一个地址。
if("abc"=="abc")  这个当然是true了。就好象if(3==3)一样
#10
newyj2008-10-24 16:29
回复 9# lockhawk 的帖子
if("abc"=="abc")  这个当然是true了。就好象if(3==3)一样
纠正一下 字符串常量就是代表这个字符串的头指针所以if("abc"=="abc") 就是 在比较 两个指针
#11
中学者2008-10-24 18:08
要是以后我能去考人,我一定不会考太多基础....
#12
sunkaidong2008-10-24 21:17
其实对于类存的分配还是很重要的。。最好还要知道算法,而且是那种可以灵活发挥的算法
#13
blueboy820062008-10-24 21:21
[bo][un]中学者[/un] 在 2008-10-24 18:08 的发言:[/bo]

要是以后我能去考人,我一定不会考太多基础....


#14
lyshyhuangli2008-10-26 22:01
学习了
#15
shiyu4602008-10-27 12:33
大悟
#16
yc07082008-10-27 13:02
应该改成:
 if(strcmp(str1,str2)==0)
就ok了
#17
csy198811222008-10-29 18:51
谢过!我收获不少。
#18
nwpu0634172008-10-29 23:23
哦,这样子啊。原来所有"abc"是被看做在一个地址上的字符常量啊。
#19
laijunqianglai2008-10-30 23:16
我加了条语句
cout<<str5<<endl<<str6<<endl;
怎么输出的地址值不一样呢??????????
#20
danielxu2008-10-31 08:39
学习了,地址和变量的问题啦
#21
shmilytong2008-10-31 12:56
后面你定义的是常指针
1