【问题标题】:Are digit separators allowed before the digits in a hex or binary number?在十六进制或二进制数字中的数字之前是否允许使用数字分隔符?
【发布时间】:2015-12-09 23:31:34
【问题描述】:

C++14 沿 3'141'592'653'589 的行将数字分隔符的概念引入文字。现在这是可读代码的 great 功能,但我想知道它是否允许在0x/0b-type 文字的数字部分之前引用 。在我看来:

unsigned int topThreeBits = 0b'1110'0000;
unsigned int hexNum       = 0x'dead'beef;

比没有前导分隔符的 更具可读性:

unsigned int topThreeBits = 0b1110'0000;
unsigned int hexNum       = 0xdead'beef;

因为它清楚地描绘了数字的基数。

由于我还没有 C++14 编译器,我需要以一种或另一种方式确认它是否允许这样做。

我知道它对于像 '123'456 这样的无前缀数字没有意义,尤其是因为解析器不知道它是一个 char 变量还是数字文字。

但是,对于带前缀的文字,我看不出在第一个 ' 到达时令牌的含义有任何混淆 - 0x/0b 已经指示它将是一个数字文字.

【问题讨论】:

  • 我也是这么想的。正如答案所说,它不能完成(还没有?)。所以为了得到对称的数字/半字节/等等,我们必须满足于下一个最好的事情:0b0'1110'0000hmm)和0x0'dead'beefomg
  • @underscore_d,领先的0 实际上是一个绝妙的主意,我没想到。前导零对值没有影响,它仍然允许视觉上不同的“实数部分”。
  • 是的,简单但有效,有时这样的事情很容易错过:-)

标签: c++ c++14 digit-separator


【解决方案1】:

如果我们查看draft C++14 standard: N4140 部分2.14.2 的语法[lex.icon],它是不允许紧跟在十六进制或二进制文字的基本指示符之后的:

binary-literal:
  0b binary-digit
  0B binary-digit
  binary-literal ’opt binary-digit
[...]
hexadecimal-literal:
  0x hexadecimal-digit
  0X hexadecimal-digit
  hexadecimal-literal ’opt hexadecimal-digit

虽然,八进制文字确实允许在基本指示符之后使用分隔符:

octal-literal:
  0
  octal-literal ’opt octal-digit

我们还可以使用提供 C++14 编译器的在线编译器之一进行检查,例如 ColiruWandbox

跟踪此更改的 Evolution 工作组问题是 issue 27: N3781 Single-Quotation-Mark as a Digit Separator, N3661, N3499 Digit Separators, N3448 Painless Digit Separation。我没有看到这个设计决定的明显理由,也许它只是对数字分隔符的字面解释。

请注意,我们可以从Where do I find the current C or C++ standard documents? 找到标准草案列表。

【讨论】:

  • 谢谢。链接也不错,我一直在使用codingground,但这似乎只适用于不是C++ 14的gcc 4.8.x。
  • 八进制指示符除外。允许在0 之后立即使用。
  • @hvd 我应该更具体,我更新了我的答案。
  • 一个有趣的问题是是否可以扩展词汇语法以允许它。我不得不承认我喜欢这个样子。它对八进制特别有用(尽管有效)。 IIRC 当我在 g++ 中实现 digit seps 时,看起来我可以在不破坏任何东西的情况下允许它。
  • @emsr 看起来它可以毫无问题地得到支持,我没有考虑太深。与 EWG 问题相关的四项提案都没有给出该决定的理由。我想知道它是否只是被认为是一个字面上的 digit sperator.
猜你喜欢
  • 2015-02-08
  • 2013-11-24
  • 2020-10-25
  • 2018-05-17
  • 1970-01-01
  • 2011-05-15
  • 2020-01-10
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多