C++串比较问题(后续)
时间:2011-04-18 来源:xi52qian
今天看到了CSDN上的一篇文章http://blog.csdn.net/UndeadWraith/archive/2011/04/08/6310399.aspx,感觉挺有意思,总结了一下,给同事们分享了下,也拿到这里来分享一下吧。
1 // f0303.cpp
2 // C串比较的错误方式
3 //=====================================
4 #include<iostream>
5 using namespace std;
6 //-------------------------------------
7 int main(){
8 cout<<("join"=="join" ? "" : "not ")<<"equal\n"; // 直接字面值比较
9 char* str1="good";
10 char* str2="good";
11 cout<<(str1==str2 ? "" : "not ")<<"equal\n"; // 字符指针比较
12 char buffer1[6]="Hello";
13 char buffer2[6]="Hello";
14 cout<<(buffer1==buffer2 ? "" : "not ")<<"equal\n"; // 字符数组比较
15 }//====================================
实际运行结果(VS2008/2005/2003 G++(版本忘记了))
equal
equal
not equal
根据大家的第一印象1和3应该都答对了,主要就是2的问题。CSDN上写文章的人使用了反汇编,来查看汇编代码比较内存来看的,后来我仔细想了想其实大可不必那么复杂。
其实,1和2开的内存都是在全局常量区,而3是在堆栈中开的内存,编译器(应该是在编译器这层把?哈哈~)会对常量存储区有个优化。比如
#define NULL "NULL"
你在程序里写了1万个NULL,难道计算机会在常量存储区开1万个NULL的内存吗?显然不是这样的,它会比较并且引用已有的相等数据,也就是说str1和str2存放的指针地址是相同。所以会相等,在堆栈中开的内存,他就是两块独立的内存,指针的地址也肯定不会相等了。
相关阅读 更多 +