“a”和'a'有什么区别?

16

我正在学习C++,有一个问题我无法找到答案。

单引号表示的char常量和双引号表示的字符串常量之间有什么区别?

所有与char数组和std::string有关的搜索结果都与我的问题不符。我想知道'a'"a"之间的区别。

做以下操作是否会有区别:

cout << "a";
cout << 'a';

尝试输入多个字符并观察差异。 - chris
6个回答

37

'a'是一个字符字面量,类型为char,在大多数系统中的值为97(ASCII/Latin-1/Unicode编码下字母a的值)。

"a"是一个字符串字面量。它的类型为const char[2],指向一个由2个char组成的数组,这两个字符分别为'a''\0'。在大多数情况下,对"a"的引用会被隐式转换为指向该字符串第一个字符的指针。

两者皆然。

cout << 'a';

cout << "a";

两段代码最终输出结果相同,但是实现的原因不同。第一个输出单个字符值。第二个逐个打印字符串的所有字符(除了终止字符'\0')-- 因为它恰好是单个字符'a'

字符串字面量可以任意长,例如"abcdefg"。字符字面量几乎总是只包含单个字符。(你可以使用多字符字面量,如'ab',但它们的值是实现定义的并且很少有用。)

(在C语言中,虽然你没有询问,'a' 的类型是 int,而 "a" 的类型是 char[2](无const)。)


谢谢,字符串字面值和 #include <string> 包含的类型是一样的吗? - james
@james,不是的,后者是一个封装了前者的类,使其更易于使用。 - chris
2
@james:不,字符串字面值是const char[]类型,但是<string>定义了一个std::string类型。C++从C继承了字符串字面值;std::string是特定于C++的。 - Keith Thompson
3
除了std::string没有以'\0'空字符结尾外,其他都一样。 - Keith Thompson
2
我认为值得注意的是,这是一个C和C++不同的领域,许多人并不期望。正如你(完全正确)所说,在C++中,像'a'这样的字符字面量具有char类型 - 但在C中,它具有int类型。 - Jerry Coffin

4

"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进行演示。


1
printf/stdio.h最好避免作为阐述C++问题的工具...! :-/ - HostileFork says dont trust SE

1

单引号用于包围字符字面量。双引号用于包围字符串(字符数组)字面量。

许多接口,例如cout <<,都可以接受其中任意一种。


0
  • "a" -> 它表示它是一个字符串。在C++中,字符串是字符数组的集合。
  • 因此,字符串以分隔符'\0'结尾,它表示字符串的结束。
  • 所以它的大小将为2,因为1个字节用于"a",1个字节用于'\0'

而对于'a'的情况->它是单个字符。因此,它的大小将为1个字节。

char str[]="a"; 

或者

char *ptr = "c";

for  'c' -> char c = 'a';

或者我们也可以这样写

char c = 97;

0

单引号'a'是类型为char的字面量。双引号"a"是以空字符结尾的char字符串字面量。


-1

'a' - 1) 字符常量 2) 大小为1的字符 3) 不是字符数组集合

"a" -1) 字符串字面值 2) 大小为2的字符 3) 是字符数组集合


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接