C++ C/C+中十六进制转义码的位数+;

C++ C/C+中十六进制转义码的位数+;,c++,unicode,escaping,C++,Unicode,Escaping,我和我的一个同事发生了争执。她说: char* a = "\x000aaxz"; 编译器将/可将其视为“\x000aa”。我不同意她的观点,因为我认为在\x之后最多可以有4个十六进制字符。你能有4个以上的六边形字符吗 谁在这里?§2.13.2/4: 转义\xhh由 反斜杠后跟x,后跟 一个或多个十六进制数字 用于指定 理想的性格。没有限制 到中的位数 十六进制序列。一连串 八进制或十六进制数字以 不是八进制数字或十六进制数字 数字 她是对的 但是,您可以通过即时链接提前终止它:文本序列“\x0

我和我的一个同事发生了争执。她说:

char* a = "\x000aaxz";
编译器将/可将其视为“\x000aa”。我不同意她的观点,因为我认为在
\x
之后最多可以有4个十六进制字符。你能有4个以上的六边形字符吗

谁在这里?

§2.13.2/4:

转义\xhh由 反斜杠后跟x,后跟 一个或多个十六进制数字 用于指定 理想的性格。没有限制 到中的位数 十六进制序列。一连串 八进制或十六进制数字以 不是八进制数字或十六进制数字 数字

她是对的

但是,您可以通过即时链接提前终止它:文本序列
“\x000a”“axz”
指定一个四个字符的字符串文本。(2.13.4/3)


还要注意Unicode;它不在16位停止。

< P>引用C++字符常量的MSDN:

以\ooo形式指定的八进制转义序列由反斜杠和一个、两个或三个八进制字符组成。以\xhh形式指定的十六进制转义序列由字符\x后跟十六进制数字序列组成。与八进制转义常数不同,转义序列中十六进制数字的数量没有限制


因此,十六进制转义序列以非十六进制字符结尾, e、 g\x0abc9k是十六进制的0abc9,然后是“k” 因此,为了结束一个十六进制序列,必须在它的末尾使用两次双引号 e、 g.\x0ab“c9k,只接受0ab作为十六进制

或者,您也可以使用八进制转义序列,因为八进制转义序列中的数字有限,所以其中最多只有三个八进制数字。。 e、 g.\o1234是八进制的123,然后是“4”


是的,她是对的。

我已经被无限的HEX文字咬了好几次,当转义序列中的字符恰好是一个有效的十六进制数字时,在Visual C++中,WCHARYT是16位。在Linux上,它是32位的。结束十六进制转义序列的唯一有效方法是“热切连锁”吗?@sukhmel您可以使用通用字符名指定下一个字符,该名称是十六进制Unicode码点:
“\x000a\u0061xz”
。这比连锁要差得多。我认为没有其他办法了。@Potatoswatter:我的偏好通常是将转义拆分成单独引用的部分:
“物品成本”“\x123”“12.34”
。它有点笨重,但它使转义项的边界变得清晰。MSDN上的信息:在那里,它们对
\x05five
案例非常清楚