c++ - 为什么没有为 C++14 数字分隔符选择空格字符?

标签 c++ language-lawyer c++14 digit

从 C++14 开始,感谢 n3781 (这本身并不能回答这个问题)我们可以编写如下代码:

const int x = 1'234; // one thousand two hundred and thirty four

目的是改进这样的代码:

const int y = 100000000;

并使其更具可读性。

下划线 (_) 字符在 C++11 中已被用户定义的文字采用,而逗号 (,) 存在本地化问题 — 许多欧洲国家令人费解地 使用它作为小数分隔符 - 并且与逗号运算符冲突,但我确实想知道允许例如可能会破坏哪些实际代码1,234,567.

无论如何,更好的解决方案似乎是空格字符:

const int z = 1 000 000;

这些相邻的数字文字标记可以由预处理器连接起来,就像字符串文字一样:

const char x[5] = "a" "bc" "d";

相反,我们得到了撇号 ('),我所知道的任何书写系统都没有将它用作数字分隔符。

是否有理由选择撇号而不是简单的空格?


令人费解的是,所有这些语言在文本中都保留了逗号“拆分”原本原子句子的概念,句号用于“终止”句子——至少对我来说,这非常类似于逗号“分解”数字的整数部分和句点“终止”它,为小数输入做好准备。

最佳答案

以前有一篇论文,n3499 ,这告诉我们,尽管 Bjarne 本人建议将空格作为分隔符:

While this approach is consistent with one common typeographic style, it suffers from some compatibility problems.

  • It does not match the syntax for a pp-number, and would minimally require extending that syntax.
  • More importantly, there would be some syntactic ambiguity when a hexadecimal digit in the range [a-f] follows a space. The preprocessor would not know whether to perform symbol substitution starting after the space.
  • It would likely make editing tools that grab "words" less reliable.

我猜下面的例子是注意到的主要问题:

const int x = 0x123 a;

虽然在我看来这个理由是相当薄弱的。我仍然想不出一个真实的例子来打破它。

“编辑工具”的原理更糟,因为 1'234 基本上破坏了人类已知的所有语法荧光笔(例如 Markdown 在上述问题本身中使用的!)并制作了更新版本说荧光笔更难实现。

不过,无论好坏,这都是导致采用撇号的理由。

关于c++ - 为什么没有为 C++14 数字分隔符选择空格字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27767781/

相关文章:

c++ - 在 C++ 中创建类型列表组合

c++ - 为什么互斥锁和条件变量可以轻松复制?

c++ - 没有上下文类型信息的重载函数

c++ - 我应该使用哪个容器进行随机访问、廉价的添加和删除(无需取消/分配),并且最大大小已知?

go - 为什么 "import"和ImportSpec之间可以出现多行注释,而PackageName和ImportPath之间不能?

c++ - 为什么没有透明的 C++1x std::map::at?

c++ - 在普通对象安全的任何上下文中,原子对象是否不安全?

c++ - 没有 RTTI 的 dynamic_cast

c++ - 扩展现有结构/类以将其序列化为字符串

c++ - vc++窗体窗口