示例:
char arr[] = "\xeb\x2a";
顺便问一下,以下两者是否相同?
"\xeb\x2a"
与 '\xeb\x2a'
\x
表示十六进制字符转义。用于指定无法输入的字符(例如空值'\x00'
)。
"\xeb\x2a"
是一个字面量字符串(类型为char *
,3字节,以空字符结尾),而 '\xeb\x2a'
则是一个字符常量(类型为int
,2字节,不以空字符结尾,只是另一种写出0xEB2A或60202或0165452的方式)。两者不同 :)
\x
是转义序列,表示一个"十六进制转义序列"。'
)内使用时,这些字符是"整型字符常量"的一部分,它是 (6.4.4.4/2 "Character constants"):'x'
。'ab'
)或包含不映射到单字节执行字符的字符或转义序列的整型字符常量的值是由实现定义的。'\xeb\x2a'
是一个实现定义值。它很可能是int值0xeb2a
或0x2aeb
,具体取决于目标平台是大端还是小端,但你必须查看编译器的文档才能确定。"
)内使用时,由hex-escape-sequence指定的字符是空字符结尾的字符串字面值的一部分。'
既可以被表示为自身,也可以被转义序列\'
表示,但双引号"
必须由转义序列\"
表示。int
常量时才提供任何价值。例如,'\xeb\x2a'
根据你需要的值,更可移植地指定为0xeb2a
或0x2aeb
。enum CommandId {
CMD_ID_READ = 'read',
CMD_ID_WRITE = 'writ',
CMD_ID_DEL = 'del ',
CMD_ID_FOO = 'foo '
};
上述方法存在少量可移植性问题(除了可能会在使用小整数的平台上出现警告)。无论字符以小端还是大端形式结束,代码仍将正常工作(除非您在枚举值中执行其他不可描述操作)。如果字符以不符合您期望的字节序列方式进入值,则可能会使调试器中的值变得更难读取,但“正确性”不受影响。
'\xeb\x2a'
和char[0]='\xeb',char[1]='\x2a'
是一样的吗? - user198729'\xeb\x2a'
是一个具有实现定义值的int
。该值几乎肯定为0xeb2a或0x2aeb;哪一个几乎肯定取决于平台的字节序。我想一些编译器可能会将'\xeb\x2a'
转换为0xffffeb2a,如果它们决定进行符号扩展的话。我不知道这有多大可能性。 - Michael Burrchar
而不是 int
,这与C语言不同。 - Searene'\xeb\x2a'
吗? - user198729int
,而不是short int
。它的值是实现定义的。 - CB Bailey这是一个特殊字符,表示该字符串实际上是一个十六进制数。
http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm
\x
表示十六进制字符转义。因此,\xeb
将表示十六进制中的字符 eb
,或者在十进制中为 235
。请参阅 http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx 以获取更多信息。
至于第二个问题,不,它们不相同。双引号 "
表示一串字符,即一个以 null 结尾的字符数组,而单引号 '
表示一个单独的字符,即该字符所代表的字节。
\x 允许您通过十六进制代码指定字符。
这使您可以指定通常不可打印的字符(其中一些具有预定义的特殊转义序列,例如'\n'=换行符和'\t'=制表符'\b'=响铃符)
printf()
等函数所使用的格式字符串的描述,而不是C语言字面量理解的转义序列。此外,它也是特定于C++的,但由于提问者询问的是神秘的C/C++语言,我会让它通过。 - RBerteig
char
,2个字节 - 嗯,我认为通常不适合放入char
中。 - Cascabel'\xeb\x2a'
不是类型为char[2]的变量 - 它是一个具有实现定义值的int
类型。 - Michael Burr'\xeb\x2a\xeb\x2a\xeb'
和'\xeb\x2a\xeb'
呢? - user198729