关于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




