免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20235 | 回复: 16
打印 上一主题 下一主题

[C] 字符串比较用==可以吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-20 14:24 |只看该作者 |倒序浏览
写了个字符串比较,
struct query{
   const char *a;
};
int main()
{
   query _a;
   _a.a="t";
   if( strstr(_a.a,"d")!= NULL)
   {
      printf("yes");
   }
   else{


   if ( _a.a=="c"){
    printf("ok");
   }
   else if(_a.a=="t"){
    printf("nook");
  }
}
   return 0;
}
发现输出结果竟然是对的,是nook。但是同样的结构在公司线上服务,用==是比较不了字符串的?这个==真不能 比较吗?如果不能比较,为什么这边是正确的?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-12-20 14:26 |只看该作者
两个"t"被优化了,==比较指针值是否相等

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2013-12-20 14:31 |只看该作者
本帖最后由 bruceteen 于 2013-12-20 14:32 编辑

字符串比较用==可以吗?
------- 看你是比较字符串内容,还是比较字符串地址。
对于C语言而言:
      如果都是常量字符串,那么可以用==来比较字符串地址;在同一个编译模块中,也可以用==来比较字符串内容。
      如果不是常量字符串,用==只能比较地址
对于C++语言而言:
      无论是不是常量字符串,用==只能比较地址

例如,C中
if( "t" == "t" ) 肯定是成立的,因为第一个"t"和第二个"t"是同一个"t",地址肯定也相同
但 char a[] = "t"; if( a == "t" ) 肯定不成立,因为 a 和 "t" 地址不同

在C++中
if( "t" == "t" ) 也未必成立,当然也未必不成立

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
4 [报告]
发表于 2013-12-20 14:47 |只看该作者
bruceteen 发表于 2013-12-20 14:31
字符串比较用==可以吗?
------- 看你是比较字符串内容,还是比较字符串地址。
对于C语言而言:


"1" == "1"
求值结果可以是0 可以是1

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
5 [报告]
发表于 2013-12-20 14:59 |只看该作者
回复 4# lin5161678


    为何。
   我觉得相同的字符串在编译器看来存放在同一个地址更合理一些。如此一来,就是地址相等的

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2013-12-20 15:11 |只看该作者
回复 5# seufy88


    是否合并字符串常量这个是依赖编译器的行为,C 标准并不要求编译器一定要合并。所以说 "1" == "1" 的结果是 0 是 1 都是正确的。

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
7 [报告]
发表于 2013-12-20 17:19 |只看该作者
回复 6# MMMIX


    恩。你说的也有道理,C语言本身并不规定这一块东西。
   所以这个比较的结果完全依赖于编译器。0和1都是可以接受的。

论坛徽章:
0
8 [报告]
发表于 2013-12-22 16:03 |只看该作者
C语言里没有字符串这个类型, C++里面有,叫std::string。
C里面的叫指针,也就是const char*,其实你问的是指针可以用==么,这个是可以的,但相等只表明指针相等,不表明指向的内容。

论坛徽章:
0
9 [报告]
发表于 2013-12-23 14:49 |只看该作者
可以看下《C语言接口与实现中》的第2章,“原子”,就是介绍的字符串,对于相同长度,内容相同的,会将它们都放在一个地址(其实就是第一次调用的放在堆上,后续的就跳过),然后字符串的比较操作,就可以直接用“==”了,因为堆上的地址,是唯一的~

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
10 [报告]
发表于 2013-12-23 17:11 |只看该作者
回复 9# 十舍七匹狼

很不幸的告诉你 错了
不保证唯一
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP