字符串常量比较问题

steven30832 2013-04-08 09:55:33
1.
char *str = "hello";
return str == "hello";

2.return "hello" == "hello"

请教一下,为什么这两种情况下返回的结果都是1?
...全文
610 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
steven30832 2013-04-10
  • 打赏
  • 举报
回复
引用 31 楼 zgxyz2010 的回复:
实际一个地址值比较,而str指向的地址就是后面字符串常量地址,所以相等,返回true
哈哈,看似简单直观,其实内藏玄机。
steven30832 2013-04-10
  • 打赏
  • 举报
回复
感谢大家的回答! 总结一下就是: 1.字符串常量都放在全局数据区,而访问的方式是首地址,因此第一个方式就是在进行地址的比较; 2.同样,两个常量直接比较也是在比较首地址; 3.这两个问题的关键就在于,编译器在存储值相同的常量的时候,是否都放在了同一个地址中,如果是在同一个地址中,那如上两者都应该是返回1,否则都应该返回0;
beautyangus 2013-04-09
  • 打赏
  • 举报
回复
另外 char *str = "hello"; return str == "hello"; 有几率被编译器优化成
beautyangus 2013-04-09
  • 打赏
  • 举报
回复
/GF和/GF-的问题
夜空_3 2013-04-09
  • 打赏
  • 举报
回复
刚刚开始的时候以为都是1,真心学习过了
赵4老师 2013-04-09
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
steven30832 2013-04-08
  • 打赏
  • 举报
回复
引用 17 楼 lin5161678 的回复:
引用 13 楼 zhoujielunzhimi 的回复:引用 8 楼 steven30832 的回复:引用 2 楼 zhoujielunzhimi 的回复:1,str指向常量区的hello首地址,比较的是地址。 2,比较的还是地址 地址都一样 我本来是认同第一种说法的,但是后来再理解过来,第二种情况下,==号左边的"hello"和右边的"hello"是保存在同一……
可能真是编译器原因,你这是用的什么编译器?
笨蛋糕 2013-04-08
  • 打赏
  • 举报
回复
引用 20 楼 Athenacle_ 的回复:
围观中,不说话
学习中,不说话
Athenacle_ 2013-04-08
  • 打赏
  • 举报
回复
围观中,不说话
bravery36 2013-04-08
  • 打赏
  • 举报
回复
我觉得好一点的编译器肯定用同一个地址,但是这并不是必然的要求,所以这种比较真心蛋痛。
sumos 2013-04-08
  • 打赏
  • 举报
回复
引用 17 楼 lin5161678 的回复:
引用 13 楼 zhoujielunzhimi 的回复:引用 8 楼 steven30832 的回复:引用 2 楼 zhoujielunzhimi 的回复:1,str指向常量区的hello首地址,比较的是地址。 2,比较的还是地址 地址都一样 我本来是认同第一种说法的,但是后来再理解过来,第二种情况下,==号左边的"hello"和右边的"hello"是保存在同一……
我在vs2010下做了如下测试: char* str = "Hello"; int k = (str == "Hello"); int m = ("Hello" == "Hello"); printf_s("%d %d %d %d", k, m, str == "Hello", "Hello" == "Hello"); 结果输出:1 1 1 1 太神奇了,看来与编译器有关。
lin5161678 2013-04-08
  • 打赏
  • 举报
回复
引用 13 楼 zhoujielunzhimi 的回复:
引用 8 楼 steven30832 的回复:引用 2 楼 zhoujielunzhimi 的回复:1,str指向常量区的hello首地址,比较的是地址。
2,比较的还是地址
地址都一样

我本来是认同第一种说法的,但是后来再理解过来,第二种情况下,==号左边的"hello"和右边的"hello"是保存在同一个地址么?这里出现了两个值为hello的常量,这两个常量……
不要这么肯定嘛
给你看看这个
mujiok2003 2013-04-08
  • 打赏
  • 举报
回复
比较地址咯,不要假设总是成立。
sumos 2013-04-08
  • 打赏
  • 举报
回复
引用 14 楼 steven30832 的回复:
引用 13 楼 zhoujielunzhimi 的回复:引用 8 楼 steven30832 的回复:引用 2 楼 zhoujielunzhimi 的回复:1,str指向常量区的hello首地址,比较的是地址。 2,比较的还是地址 地址都一样 我本来是认同第一种说法的,但是后来再理解过来,第二种情况下,==号左边的"hello"和右边的"hello"是保存在同一……
可以这么说。在java中,编译器也是这么处理的
steven30832 2013-04-08
  • 打赏
  • 举报
回复
引用 13 楼 zhoujielunzhimi 的回复:
引用 8 楼 steven30832 的回复:引用 2 楼 zhoujielunzhimi 的回复:1,str指向常量区的hello首地址,比较的是地址。 2,比较的还是地址 地址都一样 我本来是认同第一种说法的,但是后来再理解过来,第二种情况下,==号左边的"hello"和右边的"hello"是保存在同一个地址么?这里出现了两个值为hello的常量,这两个常量……
那也就是说和编译器相关,和语言本身关系不大咯?
sumos 2013-04-08
  • 打赏
  • 举报
回复
引用 8 楼 steven30832 的回复:
引用 2 楼 zhoujielunzhimi 的回复:1,str指向常量区的hello首地址,比较的是地址。 2,比较的还是地址 地址都一样 我本来是认同第一种说法的,但是后来再理解过来,第二种情况下,==号左边的"hello"和右边的"hello"是保存在同一个地址么?这里出现了两个值为hello的常量,这两个常量地址是一样的么?
两个值为hello的常量,编译器这么聪明,肯定只会在常量区保留一个hello
steven30832 2013-04-08
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
等式成立,所以返回1。lz认为应该返回什么呢?
you did not catch the point....bu thanks all the same...
steven30832 2013-04-08
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
没要求说 两个相同的字符串字面值 必然是同一个对象 编译器乐意就 返回 1 不乐意就 返回值 0
从常量保存是按照地址值来访问的角度看,第二种情况按道理应该是不相等的...
lin5161678 2013-04-08
  • 打赏
  • 举报
回复
引用 9 楼 lin5161678 的回复:
引用 3 楼 wskzgz 的回复:str指向“hello”,从第一个字符开始取值比较!你说的是 *str == *"Hello" 这个才是取第一个字符比较 并且求值结果是0
纠正 求值结果是 1
lin5161678 2013-04-08
  • 打赏
  • 举报
回复
引用 3 楼 wskzgz 的回复:
str指向“hello”,从第一个字符开始取值比较!
你说的是 *str == *"Hello" 这个才是取第一个字符比较 并且求值结果是0
加载更多回复(17)

64,648

社区成员

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

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