【发布时间】:2012-07-02 00:12:30
【问题描述】:
我正在学习 C++,但有一个我找不到答案的问题。
char 常量(使用单引号)和字符串常量(使用双引号)有什么区别?
我的所有搜索结果都与 char 数组 vs std::string 相关。我追求'a' 和"a" 之间的区别。
执行以下操作会有区别吗:
cout << "a";
cout << 'a';
【问题讨论】:
-
尝试输入多个字符并观察差异。
我正在学习 C++,但有一个我找不到答案的问题。
char 常量(使用单引号)和字符串常量(使用双引号)有什么区别?
我的所有搜索结果都与 char 数组 vs std::string 相关。我追求'a' 和"a" 之间的区别。
执行以下操作会有区别吗:
cout << "a";
cout << 'a';
【问题讨论】:
'a' 是一个字符文字。它是 char 类型,在大多数系统上的值为 97(字母 a 的 ASCII/Latin-1/Unicode 编码)。
"a" 是一个字符串文字。它的类型为const char[2],引用了一个包含2 个chars 的数组,其值为'a' 和'\0'。在大多数(但不是全部)上下文中,对 "a" 的引用将被隐式转换为指向字符串第一个字符的指针。
两者
cout << 'a';
和
cout << "a";
碰巧产生相同的输出,但出于不同的原因。第一个打印单个字符值。第二个连续打印字符串的所有字符(除了终止的'\0')——恰好是单个字符'a'。
字符串字面量可以任意长,例如"abcdefg"。字符文字几乎总是只包含一个字符。 (您可以有多字符文字,例如'ab',但它们的值是由实现定义的,很少有用。)
(在您没有询问的 C 中,'a' 的类型为 int,而"a" 的类型为 char[2](没有 const)。
【讨论】:
const char[],但<string> 定义了std::string 类型。 C++ 继承自 C 的字符串文字; std::string 特定于 C++。
std::string 不是由'\0' 空字符终止。
'a' 这样的字符文字的类型为 char - 但在 C 中,它的类型为 int。
"a" 是一个字符数组,恰好只包含一个字符,或者如果你在末尾计算 \0 则包含两个字符。 'a' 是一个字符。他们不是一回事。例如:
#include <stdio.h>
void test(char c) {
printf("Got character %c\n", c);
}
void test(const char* c) {
printf("Got string %s\n", c);
}
int main() {
test('c');
test("c");
}
这将使用两个不同的重载;有关演示,请参阅 http://codepad.org/okl0UcCN。
【讨论】:
单引号用于包围字符文字。双引号用于包围字符串(字符数组)文字。
许多接口,例如cout <<,都接受。
【讨论】:
单引号'a' 是char 类型的文字。双引号 "a" 是 chars 的以 null 结尾的字符串文字。
【讨论】:
如果是 'a'-> 它是单个字符。所以它的大小是 1 字节。
char str[]="a";
或
char *ptr = "c";
for 'c' -> char c = 'a';
或者我们也可以写
char c = 97;
【讨论】:
'a' - 1) 字符常量 2) 大小 - 1 个字符 3) 不是字符数组的集合
"a" -1) 字符串字面量 2) 大小 - 2 个字符 3) 字符数组的集合
【讨论】: