在转义字符中以十进制,八进制和十六进制表示法标识整数文字是否相同?

时间:2016-02-18 21:03:29

标签: c++

通过第5版 C ++ Primer 书,我被告知以0开头的整数文字被解释为octal。它给我留下了关于如何用以下符号表示整数文字20的示例:

 20 `/* decimal */` 024 `/* octal */` 0x14 `/* hexadecimal */`

推进几页,然后我介绍了转义字符以及如何使用octalhexadecimal数字来表示字符的数字值。然后我被提出了这个......

std::cout << "Hi \x4dO\115!\n"; // prints Hi MOM! followed by a newline
std::cout << '\115' << '\n'; // prints M followed by a newline
  

请注意,如果\后面跟有三个以上的octal位数,则只有前三个与\相关联。例如,\1234   代表两个字符:octal代表的字符   值123和字符4。相反,\x会占用所有十六进制   跟随它的数字; \x1234表示单个16位字符   由对应于这四个hexadecimal数字的位组成。   因为大多数机器都有8位字符,所以这些值不太可能   有用。通常,超过8位的hexadecimal个字符是   与使用其中一个前缀的扩展字符集一起使用   表2.2

好的是,decimal在表示字符的数值时不与转义字符一起使用,或者使用转义字符更改定义为octal的内容的整体解释?我感到很困惑,因为我认为octals被解释为以0开头的文字(如果它后面没有x),但我读的是什么从上一个块引用...

  

例如,\1234代表两个字符:字符   由octal123和字符4表示。

它表示八进制值 123,但没有0。那么只有转义字符才会截断零,如果是这样,那么在使用转义字符时如何表示decimal字面值?

3 个答案:

答案 0 :(得分:2)

八进制文字需要以0开头。这是告诉编译器我们正在使用八进制数的原因。使用转义字符时,它后面的数字被视为八进制数,并且不需要以0作为前缀,因为编译器知道它是八进制数。这就是为什么如果你想使用十六进制数字需要\x

Cppreference有一个很好的表格,显示所有escape sequences

答案 1 :(得分:2)

  

它表示八进制值 123,但没有0.所以只有转义字符才能截断零,如果是,那么使用转义字符时如何表示十进制文字?

这是正确的 - 你不需要零来获得八进制转义序列。语法在[lex.ccon]中定义为:

octal-escape-sequence:
    \ octal-digit
    \ octal-digit octal-digit
    \ octal-digit octal-digit octal-digit

hexadecimal-escape-sequence:
    \ hexadecimal-digit
    hexadecimal-escape-sequence hexadecimal-digit

或者:

  

转义\ooo由反斜杠后跟一个,两个或三个八进制数字组成,这些数字用于指定   所需字符的值。转义\xhhh由反斜杠后跟x后跟一个反斜杠组成   或更多十六进制数字,用于指定所需字符的值。没有限制   十六进制序列中的位数。八进制或十六进制数字序列由终止   第一个字符分别不是八进制数字或十六进制数字。角色的价值   如果文本超出为char定义的实现定义范围(对于。{   没有前缀的文字)或wchar_t(对于以L为前缀的文字)。

因此\19将是一个八进制文字,其值为1,后跟一个值为9的十进制文字。没有十进制转义序列。列举了完整的可能性表here

答案 2 :(得分:2)

可以使用以下转义序列定义字符。

来自C ++ 11标准:

2.14.3字符文字

simple-escape-sequence: one of
\’ \" \? \\
\a \b \f \n \r \t \v

octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit

hexadecimal-escape-sequence:
\x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit

字符串文字可以使用任何用于定义字符文字的转义序列。

来到你的问题......

  

好的是,当表示字符的数值

时,十进制不与转义字符一起使用

答案是“是”。小数不能用于定义字符串文字中字符文字或字符的转义序列。

  

我很困惑,因为我认为octals被解释为以0开头的文字,如果它后面没有x,

仅适用于整数文字,而不是用作字符文字和字符串文字中字符的转义序列。