CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于C和C++在变量内存上的区别,请教:

楼主rocklabzhang()2004-12-01 13:44:36 在 C/C++ / C++ 语言 提问

请教两个问题:  
  1、"a"=="a"这句在C编译器里输出false,而在C++编译器里输出true;  
  请高手指教  
  问题点数:10、回复次数:18Top

1 楼steedhorse(晨星)回复于 2004-12-01 13:52:49 得分 1

语言标准并没有规定这个结果该是true还是false,即使同是C++语言,不同的编译器可能也输出不同的结果。Top

2 楼steedhorse(晨星)回复于 2004-12-01 13:53:42 得分 1

比较字符串内容应该是用strcmp,或者重载了operator==的字符串类,如STL的std::string和MFC的CString。Top

3 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2004-12-01 13:57:24 得分 1

这是因为你的“a”分配倒一个静态空间了,所以它们(的地址)相同。因为一些C++编译器这样的做法节省了静态存储空间啊,   确实嘛,   都是一样的东西,   都不是变量,   为什么要有两个副本呢?Top

4 楼jk01dingxian(蓝光书虫~痛并快乐着~)回复于 2004-12-01 13:58:02 得分 1

我觉得这好象跟变量在内存中,没关系呀。你给出来的根本就没变量。关于你问的题目有N多的帖子,你检索一下。多看几个帖子就明白了。Top

5 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2004-12-01 13:58:13 得分 1

steedhorse(晨星)   说得很对。Top

6 楼rocklabzhang()回复于 2004-12-01 13:59:35 得分 0

我试过了,在vc6   vc.net和dev   c++里编译的结果都是true,而在turboC里却是false  
  我只是想知道,在C里这两个"a"比的是不是他们的存储地址?Top

7 楼rocklabzhang()回复于 2004-12-01 14:04:10 得分 0

还是不懂  
  Top

8 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2004-12-01 14:06:01 得分 1

我前面说了,   都是比较地址。   只不过TC生产了两个"a",   地址当然不同了。  
  VC为了节省空间,   就只有一个   "a",   地址当然相同了!!Top

9 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2004-12-01 14:08:50 得分 1

你会VC的调试嘛?  
   
  你明白char   *   a   =   "hello   world";  
  和   。   char   a[]   =   "hello   world";的区别嘛?  
  要是知道把你VC的内存调试打开,。。。Top

10 楼csdnlady()回复于 2004-12-01 14:15:23 得分 1

带双引号的表示一个常量字符串(赋值给数组时则比较特殊),在C或C++中都表示一个地址,即这个字符串的首地址。但不同的编译器有时会把相同的字符串存在同一内存地址中而有些会分开存储。如果是前都当然相等比较值为真否则为假。Top

11 楼YAMABACK(不要把我当Michael,我只是会投篮)回复于 2004-12-01 14:17:48 得分 1

“==”在c或c++里面都是比较地址的Top

12 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2004-12-01 14:21:09 得分 1

csdnlady()   我认为你理解错了。  
  “dfhsdkfjakdf”赋给数组时,并没有什么特殊的,   只不过是多了一个看不见   的COPY过程了。  
  而静态区还是有这个字符串的,但是你的数组也有,   也就是说copy出来一个副本。  
  Top

13 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2004-12-01 14:21:54 得分 0

==就是“值”比较,除非你重载了,干了啥“勾当”Top

14 楼libbyliugang()回复于 2004-12-01 14:53:15 得分 0

字符串常量就是指针常量(   char*   const   ...)  
  因此,字符串常量的比较就是指针的比较;  
  只要,两个指针的值相等(字符串首地址相同)  
  那么这种比较就为true否则就为false;  
  在不同的编译系统中,字面值完全相同的字符串常  
  量的“优化方式”会有所不同;  
  有些编译器将这种字面值完全相同的字符串常量进行合并。  
  使用这些编译器,则在不同地方申明的相同字符串事实上  
  就只有一个因此在进行比较时可以得到true结果;  
  而另外一些编译器,则将相同的字符串在不同的内存地址中存放,  
  于是,比较的结果就为false。  
  还有一些编译器可以提供处理这种情况的优化选项(C++builder和  
  Visual   C++都可以),用户可以自己根据需要设定。  
  重载operator==(char*const,char*const)是没有用的,大家可以查看  
  c++的名字查找规则。  
  Top

15 楼rocklabzhang()回复于 2004-12-01 15:41:09 得分 0

个人认为楼上的有见地Top

16 楼steedhorse(晨星)回复于 2004-12-01 16:46:59 得分 0

优化方式不一样,有的编译器不给同样的字符常量分配同样的空间,而有的编译器为了节省空间,给同样的字符常量分配同样的空间,就这么简单呀。Top

17 楼steedhorse(晨星)回复于 2004-12-01 16:48:09 得分 0

sorry,说错了,不是“字符常量”,是“常量字符串”,或叫“字面字符串”。Top

18 楼heguosheng(何国胜)回复于 2005-04-18 13:46:23 得分 0

收藏Top

相关问题

  • c\C++全局变量有什么区别?
  • c语言中Static 变量与全局变量有什么区别?
  • C的四种变量存储类型有什么区别
  • 问个C++和java中变量声明定义的区别?
  • 请问如何知道c#中一个变量或对象的内存地址
  • 直接定义变量与使用new,delete有什么区别,在内存一级(stack and heap)?
  • 变量的内存分配
  • 在标准C++中使用STL string变量,如果不调用~basic_string(),会造成内存泄漏吗?
  • 请问C语言程序中的代码包括变量在内存中是如何存储的
  • c++builder中有没有类似于内存地址及变量显示的控件

关键词

  • c++
  • 编译器
  • 内存
  • 字符
  • 指针
  • 优化
  • vc
  • 字符串
  • 常量
  • 变量

得分解答快速导航

  • 帖主:rocklabzhang
  • steedhorse
  • steedhorse
  • healer_kx
  • jk01dingxian
  • healer_kx
  • healer_kx
  • healer_kx
  • csdnlady
  • YAMABACK
  • healer_kx

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo