c++中char指针问题(和钱能的c++程序设计教程结果不一样)

代码:
/*

  • f0303.cpp *
  • Created on: 2016年9月8日
  • Author: Administrator */ # include using namespace std;

int main() {

cout<<("join" == "join" ? "" : "not ")<<"equal\n";

char* str1 = "good";
char* str2 = "good";
cout<<(str1 == str2 ? "" : "not ")<<"equal\n";
char buffer1[6] = "Hello";
char buffer2[6] = "Hello";
cout<<(buffer1 == buffer2 ? "" : "not ")<<"equal\n";

return 0;

}

运行结果:
equal
equal
not equal

("join" == "join" ? "" : "not ") ===>"join" == "join"结果为true,选择“”即没有输出;
<<"equal\n"; ===>此处输出equal(即第一个equal)
(str1 == str2 ? "" : "not ") ===>此时str1余str2相等,输出为空,也是后面的语句:<<"equal\n";输出了第二个equal;
前面两个str都是指向同一个字符串“good”
(buffer1 == buffer2 ? "" : "not ")===>此处两个buffer地址并不相同,buffer1 == buffer2结果是false,输出not;
后面的equal输出同上。这里的buffer虽然内容相同,但是存储内容的内存是不同的。

char* str1 = "good";
char* str2 = "good";
这个属于编译器未定义行为,也就是作为常量的good,编译器产生一个,两个都指向那个,还是产生两个,这个不同的编译器实现不同,结果不同。

我在3个不同的mingw版本下测试都是这个结果。在linux gcc上应给也是这个结果。没装VS,没有在上面测试过。
第1个和第3个输出结果没有争议,这里最核心的是滴2个输出结果。正常来说,对于常量字符串,应该在常量区只有一份,程序中的变量都只有它的一个引用。所以这个结果从理论上分析也是没问题的。