在C或c++编程中什么时候应该使用单引号和双引号?


当前回答

一些编译器还实现了一个扩展,允许多字符常量。C99标准说:

6.4.4.4p10:“包含更多的整数字符常量的值 多于一个字符(如'ab'),或 包含一个字符或转义 不映射到 单字节执行字符,是 实现定义。”

例如,它可能是这样的:

const uint32_t png_ihdr = 'IHDR';

得到的常量(在GCC中,实现了这一点)的值是通过取每个字符并向上移动它来获得的,这样'I'就会位于32位值的最高位。显然,如果您正在编写与平台无关的代码,就不应该依赖于此。

其他回答

单引号用于单个字符。双引号用于字符串(字符数组)。如果您愿意,可以使用单引号一次一个字符地构建字符串。

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

单引号是字符(char),双引号是空结束的字符串(char *)。

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

在C和c++中,单引号标识单个字符,而双引号创建字符串字面量。'a'是一个单独的a字符文字,而"a"是一个包含'a'和空终止符的字符串文字(这是一个2字符数组)。

在c++中,字符字面值的类型是char,但请注意,在C中,字符字面值的类型是int,即sizeof 'a'在一个int为32位的体系结构中是4(而CHAR_BIT为8),而sizeof(char)在任何地方都是1。

一些编译器还实现了一个扩展,允许多字符常量。C99标准说:

6.4.4.4p10:“包含更多的整数字符常量的值 多于一个字符(如'ab'),或 包含一个字符或转义 不映射到 单字节执行字符,是 实现定义。”

例如,它可能是这样的:

const uint32_t png_ihdr = 'IHDR';

得到的常量(在GCC中,实现了这一点)的值是通过取每个字符并向上移动它来获得的,这样'I'就会位于32位值的最高位。显然,如果您正在编写与平台无关的代码,就不应该依赖于此。

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

char str[] = "Hello world";

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

char c = 'x';

正如David在另一个回答中所述,字符字面量的类型是int。