| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1354 人关注过本帖
标题:学C之初的一个问题 关于字符串的 请教各位高手·。。
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:25 
学C之初的一个问题 关于字符串的 请教各位高手·。。
貌似这个问题有些无聊。。

请见程序

程序代码:

#include <stdio.h>

int main(void)
{
    char *a = "ASDFGHJ";
    char *b = "ASDFGHJ";
   
    printf ("a=%lx b=%lx\n",a,b);
   
    return 0;
}



比如这个程序 我用gcc 默认参数编译 输出 a 和 b 是相等的

请问 是任何编译器的任何模式都是这种结果么 C语言的标准里面 对这个是怎么设计的呢

是【一定】相等 【可能】相等 还是【不应该】相等 呢

求指点 谢谢。。

/****************************************我只是分割线********************************************/

把我的感谢放在下面就埋没了 对不起各位。。

在这里感谢所有回复的人 你们的回复是我前进的动力

特别要感谢孔明等前辈的回复

分按照我的理解给的 每人都有。。

/****************************************我只是分割线********************************************/

我的结论 希望各位继续批评

1 此问题编译器相关 不同编译器实现不同 讨论意义不大

2 对于C语言中字符串的比较必须采用strcmp等函数实现 但在特定情况下 直接比较 即 "ASDF" == "ASDF" 是可能的

3 尽管有这种特性 也应该尽量避免采用这种模棱两可 或者说是没有规定的东西

4 有些书采用 "ASDF" != "ASDF" 来论证必须用strcmp比较字符串的做法是错误的

结束 再次感谢所有人


[ 本帖最后由 zklhp 于 2011-3-3 15:55 编辑 ]
搜索更多相关主题的帖子: 字符串 color 
2011-03-02 22:50
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:10 
图片附件: 游客没有浏览图片的权限,请 登录注册

我不懂,但我帮你试了下,以上是vc6.0

勤能补拙,熟能生巧!
2011-03-02 22:54
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:10 
图片附件: 游客没有浏览图片的权限,请 登录注册

以上是win—tc里的结果

勤能补拙,熟能生巧!
2011-03-02 22:55
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:2 
弱弱的问一下,是要以十六进制的形式输出a,b两个字符串吗?

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-02 23:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void)
{
    if ("BCCN" == "BCCN")
    {
        printf ("=");
    }
   
    return 0;
}


相等否。。
2011-03-02 23:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用huangapple在2011-3-2 22:55:49的发言:


以上是win—tc里的结果

你试验了 也发现问题了罢。。
2011-03-02 23:02
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我的想法

抛开C语言标准 只以我对计算机的理解看

我写的俩程序程序中 字符串都应该是相等的 最起码在【有智能】的编译器中应该是相等的

这里字符串为常量 如果编译器傻乎乎的在内存里搞两个相等的字符串 对于强壮性貌似没帮助 只会浪费内存。。

这样的话 字符串的不相等性就是相对的 比如对于定义的字符串 是直接写的常量 在内存中位置是相同的 相等即相等 没有疑问

但这个与C语言字符串不相等不矛盾 比如我动态生成的字符串就不相等啊 他们在内存中的位置不同

但是 这里我也记得不太准 不过貌似C书里面演示字符串不相等的例子 不相等的原因实际是编译器的不智能(待考。。)

Tc没法识别这俩字符串是否相等 或者不是没法 是没这种设计 反正它把这两个一样的东西原封不动的在内存里放了两遍

现在的问题就是 C标准怎么规定的了

如果C强制要求字符串不相等 那 我感觉这设计比较无聊。。 是为了不相等而不相等

或 C标准没说这档子事 这最好 留给编译器自由发挥

但我觉得 任何时候 编译器都不应该把一个字符串常量在内存中原封不动的放两遍。。。
2011-03-02 23:13
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:1 
学习学习....
2011-03-02 23:20
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:8 
非常建议楼主好好看书,如果你现在确实认真看了,那么建议你换一本书。
现在我来解释你这个问题:
首先,你要明白char *a = "ASDFGHJ";倒地是什么意思。
"ASDFGHJ"是一个常量,a指向这个常量。
验证a指向的是常量的方法:你试试a[0] = 1 可用否?程序崩溃了吧。
现在解释第一个问题,a,b都是指向了"ASDFGHJ"的字符指针,为什么a,b相同?因为你代码中a=,b=后的字符串是同一个字符串,编译器做了处理。
你可以做另外一个实验,让a=,b=后的字符串不相同,那么你会发现它们的地址是不同的。
而"BCCN" == "BCCN"中你所比较的,是两个常量字符串的地址,由之前所述,这两个常量字符串地址是相同的(好比1=1),所以输出了=。
最后,输出地址请用%p。
为楼主实践精神所感写下这些,希望对楼主有帮助。
ps: 现在的C语言教材水平参差不齐,大多数教材错误或不符合标准的内容不计其数,一些作者真是混蛋。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-03-02 23:23
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:12 
肯定不是“一定”和“不应该”。

标准里没有“可能”这种模糊的说法。我去查下标准,明天给个权威点的回答。
我印象里字符串作右值的时候语义上会被视为一个 int (这里不考虑 w_char 的情况)。应该不能用作比较的左操作数。现在没什么根据,等我查标准吧。
2011-03-02 23:23
快速回复:学C之初的一个问题 关于字符串的 请教各位高手·。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035382 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved