[英]What does \x mean in C/C++?
例子:
char arr[] = "\xeb\x2a";
BTW,以下是一样的吗?
"\\xeb\\x2a"
与'\\xeb\\x2a'
\\x
表示十六进制字符转义。 它用于指定不可输入的字符(如空'\\x00'
)。
而"\\xeb\\x2a"
是一个文字字符串(类型是char *
,3 个字节,空终止),而'\\xeb\\x2a'
是一个字符常量(类型是int
,2 个字节,不是空终止,和只是另一种写入 0xEB2A 或 60202 或 0165452 的方法)。 不一样 :)
正如其他人所说, \\x
是一个转义序列,它开始一个“十六进制转义序列”。
C99 标准的更多细节:
当在一组单引号 ( '
) 中使用时,字符是“整数字符常量”的一部分,即 (6.4.4.4/2“字符常量”):
用单引号括起来的一个或多个多字节字符的序列,如
'x'
。
和
整数字符常量的类型为 int。 包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符表示的数值。 包含多个字符(例如
'ab'
)或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。
因此, '\\xeb\\x2a'
示例中的序列是实现定义的值。 根据目标平台是大端还是小端,它可能是 int 值0xeb2a
或0x2aeb
,但您必须查看编译器的文档才能确定。
当在一组双引号 ( "
) 中使用时,由十六进制转义序列指定的字符是以空字符结尾的字符串文字的一部分。
来自 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" vs '\\xeb\\x2a'
他们实际上不是。 第一个创建一个字符串文字,以零字节结尾,包含您提供的十六进制表示的两个字符。 第二个创建一个整数常量。
它是一个特殊字符,表示字符串实际上是一个十六进制数。
http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm
\\x
表示它是一个十六进制字符转义符。 所以\\xeb
表示十六进制的字符eb
,或十进制的235
。 有关矿石信息,请参阅http://msdn.microsoft.com/en-us/library/6aw8xdf2.aspx 。
至于第二个,不,它们不一样。 双引号"
表示它是一个字符串,一个以空字符结尾的字符数组,而单引号'
表示它是一个单个字符,即该字符所代表的字节。
\\x 允许您通过其十六进制代码指定字符。
这允许您指定通常不可打印的字符(其中一些具有预定义的特殊转义序列,例如 '\\n'=newline 和 '\\t'=tab '\\b'=bell)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.