C或C++中的单引号和双引号有什么区别?

264

在C或C++编程中,何时应该使用单引号和双引号?

15个回答

350
在C和C++中,单引号表示单个字符,而双引号则创建字符串字面值。 'a' 是一个单个字符字面值,而"a"是一个包含'a'和空终止符(即一个2个字符数组)的字符串字面值。
在C++中,字符字面值的类型为char,但请注意,在C中,字符字面值的类型为int,即在一个整数为32位的体系结构中,sizeof 'a'为4(其中CHAR_BIT为8),而sizeof(char)在任何地方都是1。

1
在C语言中,字符字面量的类型是int。需要了解更多吗? - 0_0perplexed
1
对于像我这样的新手:“...而双引号则创建一个字符串字面量。” -> 在这里,“字符串字面量” 不是 std::string 的一种类型。相反,如果没有前缀(如L、u8等),类型为const char[N]参考)。实际上,即使std::string在其底层数组中包含空终止符,它也会“隐藏”空终止符。 - starriet

54

有些编译器还实现了一种扩展功能,允许多字符常量。C99标准规定:

6.4.4.4p10:“包含多个字符(例如'ab')或包含一个不能映射为单字节执行字符的字符或转义序列的整型字符常量的值是由实现定义的。”

例如,这可能看起来像这样:

const uint32_t png_ihdr = 'IHDR';

在实现这个功能的GCC编译器中,生成的常量值是通过将每个字符向上移位来获得的,以便使得'I'出现在32位值的最高有效位。显然,如果你要编写跨平台代码,就不应该依赖于此。


34

单引号是字符(char),双引号是以null结尾的字符串(char *)。

char c = 'x';
char *s = "Hello World";

8
"hello world" 是一个 const char * - OldSchool
@Eiko,什么时候在变量前面加上,例如上面的s? - CodeGuru
@CodeGuru 当变量是指针类型时,您使用*。在这种情况下,“s”指向一个字符数组。 - Eiko
2
在C++中是这样的,但在C语言中不是。在C语言中,它是一个char *,而不是一个const char * - Jack Murrow

24
  • 'x' 是一个整数,代表计算机字符集中字母 x 的数值
  • "x" 是一个字符数组,长度为两个字符,由字符 ‘x’‘\0’ 组成

15

我在探究像这样的东西:int cc = 'cc'; 发现这基本上是将它字节复制到整数。因此,可以这样理解,'cc' 基本上是 2 个 c 被复制到整数 cc 的低 2 字节中。如果你在寻找小知识点的话,

printf("%d %d", 'c', 'cc'); would give:

这是因为25443 = 99 + 256 * 99。

所以'cc'是一个多字符常量,不是字符串。

祝你好运!


我不明白这个:25443 = 99 + 256*99 为什么是256*99? - uzay95
@uzay95,仅仅因为ASCII表由256个字符组成,如果你将一个char赋值给一个整数变量,它会被隐式转换为与其char值相对应的整数值。'c'是ASCII表中第99个字符。此外,多字符常量被解释为整数。 - Sevban Bayır
@SevbanBayır,感谢您的时间和解释。这被称为整数提升,不是吗? - uzay95
@uzay95 不完全是这样。整数提升是指如果一个int不能表示分配给自己的值,那么这个整数会被隐式转换为无符号int,但在这里,情况有所不同。这是我的想法... - Sevban Bayır

11

单引号用于表示单个字符,双引号用于表示字符串(字符数组)。如果你愿意,你可以使用单引号逐个字符构建字符串。

char myChar     = 'A';
char myString[] = "Hello Mum";
char myOtherString[] = { 'H','e','l','l','o','\0' };

11
  1. 单引号 用于表示 字符(character)
  2. 双引号 用于表示 字符串(string)

8
在C语言中,单引号比如'a'表示字符常量,而"a"表示一组由\0字符终止的字符数组。

7

双引号用于字符串字面量,例如:

char str[] = "Hello world";

单引号用于单个字符字面量,例如:

char c = 'x';

编辑 正如David在另一个答案中所述,字符字面值的类型是int


感谢。'thanks.' 表示字符长度为 1 字节,末尾没有空字符 '/0'。而字符串则在末尾包含空字符。 - Vishwanath Dalvi
2
@mr_eclair:一个字符串字面值总是包含一个隐式的空终止符,但要小心。你可以像这样编写char str[] = {'H','e','l','l','o'};,并且str没有空终止符。 - Oliver Charlesworth
在这种情况下,“str”不是一个字符串(至少不是C风格的字符串,它被定义为NTBS)。 - Steve Jessop
@Steve:明白了。我对@mr_eclair的意思是,并不是所有被认为是“字符串”的char[]都是以null结尾的。 - Oliver Charlesworth
1
@OliCharlesworth 这并不完全正确,幸运的是:这是由一个注释分隔开的两个字符串字面量:“hello”/无缝连接到/“world”。对于有注释的多行消息,这是有意义的。 - Wolf

6

单引号用于表示字符,双引号用于表示字符串。

例如...

 printf("%c \n",'a');
 printf("%s","Hello World");

输出

a  
Hello World

如果您在相反的情况下使用它们,并且在字符串中使用单引号和在字符中使用双引号,结果将是这样的:
  printf("%c \n","a");
  printf("%s",'Hello World');

输出:

对于第一行,您将获得一个垃圾值或意外的值,或者您可能会得到以下输出:

对于第二个语句,您将看不到任何结果。还有一件事,如果在此之后有更多语句,它们也将不会给您任何结果。

注意:PHP语言使您可以轻松使用单引号和双引号。


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