Chinaunix

标题: "A"=="A"为什么会不成立!!!? [打印本页]

作者: 晓枫    时间: 2004-09-24 17:49
标题: "A"=="A"为什么会不成立!!!?
各位朋友谁能告诉我,为什么单个字符与它本身进行关系比较能成立即
'A'=='A'这个关系表达式的值是1,这我们都知道,可为什么进行字符串比较时也就是说"A"=="A"结果却为0,也就是说字符串比较这个关系不成立,那位高手告诉我,帮帮小弟解答一下这个看似简单的问题.!!小弟在这道谢了
作者: flw    时间: 2004-09-24 17:51
标题: "A"=="A"为什么会不成立!!!?
字符串比较请用 strcmp。
没有人告诉你 "A" == "A" 能够成立。
作者: oyjcq    时间: 2004-09-24 18:06
标题: "A"=="A"为什么会不成立!!!?
单个字符比的是ascii值

字符串用strcmp
作者: 晓枫    时间: 2004-09-24 18:08
标题: "A"=="A"为什么会不成立!!!?
呵呵,谢谢版主的回答,可是我想再问一下单个的字符串比较,就一定不许用关系运算符吗
作者: wujiajia    时间: 2004-09-24 18:09
标题: "A"=="A"为什么会不成立!!!?
如果是c++;我想可以写个运算符重载!
作者: flw    时间: 2004-09-24 18:12
标题: "A"=="A"为什么会不成立!!!?
[quote]原帖由 "晓枫"]呵呵,谢谢版主的回答,可是我想再问一下单个的字符串比较,就一定不许用关系运算符吗[/quote 发表:

对。
“字符串”不是 C 的数据类型,
而 C 也不支持运算符重载,
所以,没有一个运算符能够对字符串进行操作。
要想操作字符串,就必须用 strxxx 系列的函数。
如复制用 strcpy 连接用 strcat 比较用 strcmp 查找用 strstr 等等。
作者: 晓枫    时间: 2004-09-24 18:23
标题: "A"=="A"为什么会不成立!!!?
呵呵,回答很透彻,谢谢各位朋友的回答,谢谢版主的关注,这下我明白了;)
作者: whyglinux    时间: 2004-09-24 18:26
标题: "A"=="A"为什么会不成立!!!?
可以进行 "A" == "A"  这样的比较。不过它的含义是进行字符串指针的比较。由于编译器一般把相同的常量字符串放在一起,所以 "A" == "A"  的结果一般是真。
作者: 晓枫    时间: 2004-09-24 18:29
标题: "A"=="A"为什么会不成立!!!?
这位whyglinux这位朋友,就算你说可以进行比较,但在Turbo C里你说的这种一般为“真”的结果却几乎得不到,至少我的几次试验没有得到:)
作者: whyglinux    时间: 2004-09-24 18:30
标题: "A"=="A"为什么会不成立!!!?
>;>; 如果是c++;我想可以写个运算符重载!

对于基本的数据类型及其衍生类型(如指针),不能进行运算符重载。
作者: flw    时间: 2004-09-24 18:33
标题: "A"=="A"为什么会不成立!!!?
晓枫不得无礼!
好好听 whyglinux 哥哥讲话。
他补充地非常好。
作者: 晓枫    时间: 2004-09-24 18:34
标题: "A"=="A"为什么会不成立!!!?
呵呵,要说C++或许吧,我还没用过,我很高兴在这里通过交流,能加深我对概念的理解,谢谢各位朋友的关住,我会继续与大家交流的
作者: 晓枫    时间: 2004-09-24 18:35
标题: "A"=="A"为什么会不成立!!!?
呵呵,好版主,我哪敢无理呀,我正在吸收大家的养份呢
作者: whyglinux    时间: 2004-09-24 18:35
标题: "A"=="A"为什么会不成立!!!?
>;>; 这位whyglinux这位朋友,就算你说可以进行比较,但在Turbo C里你说的这种一般为“真”的结果却几乎得不到,至少我的几次试验没有得到:)

这说明 TC 没有对此进行编译优化处理。现在的编译器一般都会进行优化。你只要注意 "A" == "A" 比较的是指针而不是字符串本身就可以了。
作者: 晓枫    时间: 2004-09-24 18:39
标题: "A"=="A"为什么会不成立!!!?
whyglinux:你说的是比较指针,也是在比较它们所在地址的大小吧,而不是在比较字符串的大小对不对
作者: flw    时间: 2004-09-24 18:44
标题: "A"=="A"为什么会不成立!!!?
对。

"A" == "A"
实际上比较的是指针,
而不是字符串。

“字符指针”和“字符串”是两个不同的概念。
作者: 晓枫    时间: 2004-09-24 18:47
标题: "A"=="A"为什么会不成立!!!?
各位朋友,谢谢大家的关注和讨论,使我更深一步的理解的指针与字符串的概念,现在我要下线了,改天再与大家继续交流:)改天见
作者: 晓枫    时间: 2004-09-24 18:49
标题: "A"=="A"为什么会不成立!!!?
版主:)多谢你的解答和关注,改天见:)我会继续努力,继续提高的:)
作者: xtugrad    时间: 2004-09-24 22:36
标题: "A"=="A"为什么会不成立!!!?
其实这个"A"="A"的比较,是两个字符串常量的地址比较,存在不同的地方,当然值不同,这正常!
作者: 乌鸦飞飞    时间: 2004-09-24 23:14
标题: "A"=="A"为什么会不成立!!!?
其实这个"A"="A"的比较,是两个字符串常量的地址比较,存在不同的地方,当然值不同,这正常!



上面的朋友的话是不是这个意思p1=A,p2=A *p1=*p2
这样?

[/quote]
作者: 晓枫    时间: 2004-09-25 12:28
标题: "A"=="A"为什么会不成立!!!?
乌邪飞飞,我觉得你的写法有问题,你是不是想将两字符串“A”付给指针P1,P2,然后比较两个指针呀,“A”==“A”比较的是地址跟你这种比较指针的意思和作用是相用的
作者: 晓枫    时间: 2004-09-25 15:52
标题: "A"=="A"为什么会不成立!!!?
xtugrad:看到你的解释,我又想起了一个问题,两个完全相同的字符串,会不会保存在不同的地址里,如果是给两个指针赋同样的字符串,会不会在不同的地址
作者: converse    时间: 2004-09-25 17:27
标题: "A"=="A"为什么会不成立!!!?
晓风上面的whyglinux已经说的很清楚了:在编译器优化的情况下可能会放在相同的地址里
作者: 晓枫    时间: 2004-09-25 17:57
标题: "A"=="A"为什么会不成立!!!?
converse:首先多谢你的关注,不过我想你可能没有理解我的意思,我知道相同的字符串很可能会放在相同的地址里,在优化的情况下这是理所当然的,我所问的意思是,相同的字符串有没有可能放在“不同”的地址里,尤其是两个字符型指针在得到相同字符串时,它们有没有可能会放在不同的地址中,我强调的是不同的地址。所以还请各位朋友给予释,还请大家多多关注多多讨论,谢谢:)
作者: whyglinux    时间: 2004-09-25 18:45
标题: "A"=="A"为什么会不成立!!!?
To 晓枫:

你在前面的帖子中不是已经说过了 "A" == "A" 在 TC 中的结果是不相等的吗?那不就是说这两个字符串 "A" 放在不同的地址中吗?
作者: mfmain    时间: 2004-09-25 21:53
标题: "A"=="A"为什么会不成立!!!?
事实上,新的C编译器,总是会merge常量字符串,无论你是否进行优化,除非你使用了强制选项告诉编译器不要进行merge。
一般来说,编译器在编译期间,会维护一张常量字符串表,遇到一个新的与原来不同的字符串时,才往里添加一项,最后在生成代码时,把这些常量字符串生成在代码段,凡是引用相同字符串的位置,均以代码段中的偏移进行替换,因此相同常量字符串的地址总是相同的,这里我要强调的是常量字符串的地址是代码(text)段空间,而不是data段,更不是bss段,而text段一般是不允许进行写操作的,这也是不能够修改常量字符串中的内容的原因。
作者: 晓枫    时间: 2004-09-26 12:40
标题: "A"=="A"为什么会不成立!!!?
呵呵,谢谢各位朋友的解释,解释的精彩,晓枫非常感谢你们的关注:)尤其是whyglinux,这位大哥回答问题很是巧妙。mfmain,解释的更为深入更为具体,现在我明白,再次感谢大的关注和给予的帮助!:)
作者: 晓枫    时间: 2004-09-26 12:54
标题: "A"=="A"为什么会不成立!!!?
mfmain:这位朋友,你的回答有些深入这让我在明白问题的同时也产生的更多的兴趣。我还想在你的回答中再追问一个问题。你说过“C编译器,总是会merge常量字符串,无论你是否进行优化,除非你使用了强制选项告诉编译器不要进行merge。”可是我在练习时“A”==“A”是作为一个条件表达式用的,是很普通的用法,并没有用什么强制选项告诉编译器不要进行merge。可是按上面那位大哥(whyglinux)的说法,这两个相同的常量字符串确实放在了不同的地址里,编译器又确实没有进行merge,这又是为什么呢?你能再给解释一下吗?难道又是TubroC的编译器优化上的问题吗。
作者: THEBEST    时间: 2004-09-26 13:01
标题: "A"=="A"为什么会不成立!!!?
[quote]原帖由 "晓枫"]mfmain:这位朋友,你的回答有些深入这让我在明白问题的同时也产生的更多的兴趣。我还想在你的回答中再追问一个问题。你说过“C编译器,总是会merge常量字符串,无论你是否进行优化,除非你使用了强制选项告诉编译器..........[/quote 发表:
这是各大编译器的实现问题,而不是一个标准问题.
像mfmain所说是指有编译器参数,在IDE中可能有设置的.一般命令行上也有参数可设置.默认情况下是否merge那就去看编译器的文档..我觉得不要太在意这个问题,知道是怎么回事就行了.你现在不知道是怎么回事吗?知道了吧?那就行了.
作者: 晓枫    时间: 2004-09-26 13:16
标题: "A"=="A"为什么会不成立!!!?
呵呵,光明使者按你的解释我好像又明白了一些,照理说按我现在的情也不用深究太深,不过我觉得有些钻研精神能提出问还是好的。尤其是像这们这样的人,开始问题多些,以后考虑问题就会全一些,办事成功率就会高一些,烦麻也就会少一些。好了就说到这,谢谢光明使者的指点:)
作者: win_hate    时间: 2004-09-26 13:18
标题: "A"=="A"为什么会不成立!!!?
原帖由 "C A Reference Manual" 发表:

2.7.4 String Constants
......
Do not depend on all string constants being stored at different addresses. Standard C allows implementations to use the same storage for two string constants that contain the same characters.
......

作者: win_hate    时间: 2004-09-26 13:25
标题: "A"=="A"为什么会不成立!!!?
[quote]原帖由 "mfmain"]这里我要强调的是常量字符串的地址是代码(text)段空间,而不是data段,更不是bss段,而text段一般是不允许进行写操作的,这也是不能够修改常量字符串中的内容的原因..........[/quote 发表:


实际的情况要比这复杂一些,常量字符串放在什么地方与采用的二进制文件格式以及编译器的实现都有关。

你是 bsd 用户,所以我假设你所说的是 elf 文件格式,可以吗? 如果你在 bsd 上写个小程序,用 gcc 编译一下,就会发现,常量字符串放在 .rodata 中。

移植到 windows 平台的 cygwin/gcc 采用windows 的 PE 文件格式,这种格式是从传统的 coff 衍生出来的。cygwin/gcc 的确把 常量字符串 放在  .text 中。
作者: 晓枫    时间: 2004-09-26 13:39
标题: "A"=="A"为什么会不成立!!!?
首先谢谢版主(win_hate)的支持,不过版主所引用过来的文章,晓枫不敢保证会翻译准确,不知道我此文的理解是否正确,还请版主能给予指点。
上面是不是说,“不要指望所有的字符常量会存储在不同的地址。标准C允许实现为两个包含相同字符的字符常量使用相同的存储”我不知道这句理解的对不对。
作者: ljttlf    时间: 2004-09-26 15:05
标题: "A"=="A"为什么会不成立!!!?
这样的讨论,路过,学过,千万不能错过。
作者: win_hate    时间: 2004-09-26 16:10
标题: "A"=="A"为什么会不成立!!!?
[quote]原帖由 "晓枫"]上面是不是说,“不要指望所有的字符常量会存储在不同的地址。标准C允许实现为两个包含相同字符的字符常量使用相同的存储”我不知道这句理解的对不对[/quote 发表:


是的。

编译器把两个一样的串放在同一个空间,是一种优化(参考前面 whyglinux 兄的贴子)。这种技术称为  "string pooling" ,在 vc 6 下,可以用 /Gf 参数打开。在gcc下,应该有类似的参数,但我没找到........gcc 的参数,实在是太多了!
作者: 晓枫    时间: 2004-09-26 18:33
标题: "A"=="A"为什么会不成立!!!?
版主(win_hate)你的解释其实我能理解,可是我随后作了一个练习,反到把我给搞晕了,我发现同一字符串常量的地址或者说是相同字符串常量的地址时刻都在变化,这到底是为什么,是我理解错了,理解的不够深,还是我的练习有错误呢?请版主在指点一下小弟,让小弟在加深一下理解好吗!
下面是我练习时的一段程序代码和程序结果的截图。请帮小弟分析一下,小弟先谢过了!

main()
{
char *p;
/* char why[10];*/
char why[10]="world";
why[2]='R';
p=why;
p="world";
printf("%p,%p,%p,%p,%p\n",p,&p,why,"world","world";

printf("%p\n","world";
printf("%c\n","world"[2]);
printf("%p\n","world";
}
对上面的题还请所有感兴趣的朋友和大哥多多讨论,多多关注,小弟对于大家对此问题的关注非常感谢!也非常愿意与大家进行更多更深的交流。

why.GIF (3.04 KB, 下载次数: 11)

运行结果的载图

运行结果的载图

作者: ljttlf    时间: 2004-09-26 20:15
标题: "A"=="A"为什么会不成立!!!?
zhe shi wo de

lj.JPG (6.17 KB, 下载次数: 11)

lj.JPG

作者: win_hate    时间: 2004-09-26 20:16
标题: "A"=="A"为什么会不成立!!!?
按这个图修改参数,然后试一试。

merge_string.JPG (58.19 KB, 下载次数: 14)

merge_string.JPG

作者: win_hate    时间: 2004-09-26 20:20
标题: "A"=="A"为什么会不成立!!!?
还有,把你测试代码中的

char why[10]="world";


去掉。

数组与字符串常量

p="world";


是完全不同的。暂时别把数组搅进来,否则你会更糊涂的。
作者: 晓枫    时间: 2004-09-26 20:30
标题: "A"=="A"为什么会不成立!!!?
呵呵,谢谢版主的指点,我试过了,结果和ljttlf 的差不多,它们的地址都一样了,这是不是就是你们所指的merge,也就是前面有位朋友所说的强制选项的设置呢。
作者: 晓枫    时间: 2004-09-26 20:34
标题: "A"=="A"为什么会不成立!!!?
哦,我明白些了,可字符串却可以像数组那样引用下标对吧:)




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2