【发布时间】:2010-03-30 17:47:28
【问题描述】:
例子:
char arr[] = "\xeb\x2a";
顺便说一句,以下是一样的吗?
"\xeb\x2a" 与 '\xeb\x2a'
【问题讨论】:
例子:
char arr[] = "\xeb\x2a";
顺便说一句,以下是一样的吗?
"\xeb\x2a" 与 '\xeb\x2a'
【问题讨论】:
\x 表示十六进制字符转义。它用于指定不可输入的字符(如 null '\x00')。
而"\xeb\x2a" 是一个文字字符串(类型为char *,3 个字节,空终止),'\xeb\x2a' 是一个字符常量(类型为int,2 个字节,非空终止,并且只是另一种写入 0xEB2A 或 60202 或 0165452 的方式)。不一样:)
【讨论】:
char, 2 bytes" - 嗯,我认为这通常不适合 char。
char[2]。已更新。
'\xeb\x2a'和char[0]='\xeb',char[1]='\x2a'一样吗?
'\xeb\x2a' not 有一个 char[2] 类型 - 它是一个 int,其值由实现定义。
'\xeb\x2a\xeb\x2a\xeb' 和'\xeb\x2a\xeb' 呢?
正如其他人所说,\x 是一个以“十六进制转义序列”开头的转义序列。
来自 C99 标准的更多细节:
当在一组单引号 (') 中使用时,这些字符是“整数字符常量”的一部分,即(6.4.4.4/2“字符常量”):
用单引号括起来的一个或多个多字节字符序列,如
'x'。
和
整数字符常量的类型为 int。包含映射到单字节执行字符的单个字符的整数字符常量的值是被解释为整数的映射字符表示的数值。包含多个字符(例如,
'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。
因此,'\xeb\x2a' 示例中的序列是实现定义的值。它可能是 int 值 0xeb2a 或 0x2aeb,具体取决于目标平台是 big-endian 还是 little-endian,但您必须查看编译器的文档才能确定。
当在一组双引号 (") 中使用时,由 hex-escape-sequence 指定的字符是以空字符结尾的字符串文字的一部分。
来自 C99 标准 6.4.5/3“字符串文字”:
同样的考虑适用于字符串文字或宽字符串文字中的序列的每个元素,就好像它在整数字符常量或宽字符常量中一样,除了单引号
'可以表示单独或由转义序列\'表示,但双引号"应由转义序列\"表示。
附加信息:
在我看来,您应该避免使用“多字符”常量。只有在少数情况下,它们比使用常规的旧 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'一样吗?
'\xeb\x2a' 是具有实现定义值的int。该值几乎可以肯定是 0xeb2a 或 0x2aeb;哪一个几乎肯定取决于平台的字节序。我想如果某些编译器决定进行符号扩展,他们可能会将'\xeb\x2a' 转换为 0xffffeb2a。我不知道这种可能性有多大。
char,而不是 int,这与 C 不同。
当你说:
顺便说一句,这些是一样的吗:
"\xeb\x2a" 与 '\xeb\x2a'
事实上并非如此。第一个创建一个字符串文字,以零字节结尾,包含您提供的十六进制表示的两个字符。第二个创建一个整数常量。
【讨论】:
'\xeb\x2a'吗?
int,而不是short int。它的值是实现定义的。
这是一个特殊字符,表示字符串实际上是一个十六进制数。
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'=newline 和 '\t'=tab '\b'=bell)
【讨论】:
【讨论】:
printf() 等所使用的格式字符串的描述,而不是 C 文字所理解的转义序列。它也是 C++ 特定的,但由于 OP 询问的是神话语言 C/C++,我就让它过去吧。