通过第5版 C ++ Primer 书,我被告知以0
开头的整数文字被解释为octal
。它给我留下了关于如何用以下符号表示整数文字20
的示例:
20 `/* decimal */` 024 `/* octal */` 0x14 `/* hexadecimal */`
推进几页,然后我介绍了转义字符以及如何使用octal
和hexadecimal
数字来表示字符的数字值。然后我被提出了这个......
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
代表两个字符:字符 由octal
值123
和字符4
表示。
它表示八进制值 123
,但没有0
。那么只有转义字符才会截断零,如果是这样,那么在使用转义字符时如何表示decimal
字面值?
答案 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,
仅适用于整数文字,而不是用作字符文字和字符串文字中字符的转义序列。