C串的疑惑,望高手从根本上进行解答.

来源:百度知道 编辑:UC知道 时间:2024/07/07 10:36:49
程序如下
#include<iostream.h>
//=============================
void main()
{
cout<<("join"=="join" ? "" : "not" )<<"equal\n";
char* str1="good";
char* str2="good";
cout<<(str1==str2 ? "" : "not " )<<"equal"<<endl;
char buffer1[6]="hello";
char buffer2[6]="hello";
cout<<(buffer1==buffer2 ? "" : "not ")<<"equal"<<endl;
cout<<buffer1<<" "<<buffer2<<endl;
}
按钱能老师书上写的应该输出结果

not equal
not equal
not equal
而我运行后得到结果为
equal
equal
not equal
我的用的是VC++ 6.0
谢谢大家```现在重新回过头再学C++,觉得还有很多地方没搞明白

不是标不标准的问题,而是对于程序中出现的相同的常量字符串,C++标准没有给出说法,所以不少编译器为了节省空间,把相同的字符串合并,只保留一个.所以经过优化,前2个equal了,第3个显式的分配了2个不同的空间,所以not equal了

没什么根本,纯编译器问题
VC++本身就不是纯的C++标准,它有很多自己内部的数据结构和处理方法
你换个编译器,比如说TC++3.0
肯定就是
not equal
not equal
not equal
呵呵……

PS:
我已经编译过了 TC++3.0就是三个not equal
利德 - 江湖大侠 八级 8-5 17:25
你说的那不属于编译器的处理方法的问题吗??

1 "join"=="join" 这两个字符串相等。所以为真
2 char* str1="good";
char* str2="good";
你要理解"good"是存放在静态存储区的
str1 、str2都指向同一个内存地区,所以str1 == str2 为真

不理解的话,就反汇编去看汇编代码

字符串之间比较不能用==,==只能用于数字的比较,字符串比较有个函数,是strcmp(a,b),返回植是1.0.-1,表示相同,不同。具体代表什么忘了,毕业好长时间了,忘完了
如果用==比较的话,他们比较的是两个字符串在内存中的起始地址,肯定不相同

的确如前面几位兄台所说是编译器的问题,但他们都没明着说出一点,那就是3次==都是比较的字符串的地址。希望对你有点启发

学习