空字符串和 '\0' 字符有什么区别? (从指针和数组的角度来看)

What's the difference between an empty string and a '\0' char? (from a pointer and array point of view)

作为这个问题的标题?有什么区别?

如果我写:

char *cp = "a";
cout << (cp == "a") << endl;

或:

string str = "a";
cout << (str == "a") << endl;

它们是一样的,而且都是 return 正确的。但是如果我写:

char *cp = "";
cout << (cp == "[=12=]") << endl;

它return是错误的。但是:

string str = "";
cout << (str == "[=13=]") << endl;

它return是真的。

我认为从指针和数组的角度来看它们应该是相同的。但事实证明它们是不同的。它们之间的细微差别是什么?我应该如何写一个char数组来表示一个空字符串?


好的,线上方的内容可能不清楚,就像有人说的那样 "a compiler optimization"。

我真正想要的是:

char *cp = "abcd";

可以给我这样的数组:['a'、'b'、'c'、'd'、'\0']。 我想知道如何使用类似的语法来获取这样的数组:['\0']。 因为我试过:

char *cp = "";

而且这似乎不是正确的代码。我认为它可以给我想要的东西。但事实并非如此。

对于行上方的歧义,我们深表歉意。我是新手,我不知道这可能是编译器优化。

字符串文字总是在末尾有一个隐含的 [=10=]。所以 ""const char[1] 类型,由一个 [=10=] 组成,而 "[=14=]"const char[2] 类型,由 两个 [=33] 组成=] [=10=]s。如果你想要空字符串文字,只需写 ""。无需手动插入另一个 [=10=]

operator==(const char*, const char*) 比较指针,而不是字符。如果将两个不同的字符串文字与 == 进行比较,则结果肯定为假。 (如果将两个由相同字符组成的字符串文字与 == 进行比较,则结果不明确。)

std::string::operator==(const char*) 将参数视为 C 字符串。也就是说,它只会读到遇到第一个[=10=]。因此,它无法区分 """[=14=]".

"[=14=]"实际上包含两个'[=15=]'字符,其中一个是隐式创建的。

如果你写类似

char *cp = "a";
cout << (cp == "a") << endl;

你正在比较两个指针,而不是字符串内容(使用 strcmp() 来这样做),而

std::string cp = "a";
cout << (cp == "a") << endl;

比较第一个找到的内容 '[=15=]',因为 bool std::string::operator==(const char*) 超载了。


关于您的编辑:

Because I tried:

char *cp = ""; And it seems not the right code. I thought it could give me what I want. But it doesn't.

char* cp = "";

不完全相同
char cp[1] = { '[=13=]' };

因为字符串文字是使用静态存储位置创建的,而数组版本在堆栈上分配内存。