我已阅读以下C ++编程语言特别第3版:
是否将两个相同的字符文字分配为一个是实现定义的(§C.1)。
const char* p="Heraclitus";
const char* q="Heraclitus";
void g ()
{
if (p == q ) cout << "one!\n"; // result is implementation defined
// ...
}
请注意,==在应用于指针时比较地址(指针值),而不是指向的值。
我在gcc 4.8.1&amp;上尝试过以下程序MSVS 2010
#include <iostream>
int main()
{
const char* p="Heraclitus";
const char* q="Heraclitus";
if(p==q)
std::cout<<"fine!!!";
else
std::cout<<"!fine";
}
输出:
细!!! (在gcc 4.8.1上)
!很好(在MSVS 2010上)
为什么将此作为实现定义的行为?是什么原因?
答案 0 :(得分:2)
我们可以在comp.std.c thread: History question: String literals中找到理由,并说:
海湾合作委员会可能是一个例子,但不是动机。 部分希望在ROMmable数据中包含字符串文字 是支持,呃,ROMming。我含糊地回忆起曾经使用过 几个C实现(在X3J11决定之前) 使字符串文字自动合并 或存储在常数数据程序部分。 鉴于此 现有的各种实践和易用性的可用性 在需要原始UNIX属性时解决此问题, 最好不要试图保证唯一性和 字符串文字的可写性。