代码:
/*
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个输出结果。正常来说,对于常量字符串,应该在常量区只有一份,程序中的变量都只有它的一个引用。所以这个结果从理论上分析也是没问题的。