为什么没有selectC ++ 14位分隔符的空格字符?
从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;
与string文字一样,这些相邻的数字文字标记可以被预处理器连接起来:
const char x[5] = "a" "bc" "d";
相反,我们得到撇号( '
),而不是任何我知道作为数字分隔符的书写系统。
有没有理由select撇号而不是简单的空间?
†这是令人困惑的,因为所有这些语言在文本中都保留了一个逗号“分开”的句子的概念,这个句子有一段可以“终止”这个句子的句子 – 对我来说,至less,这与一个类似于逗号“分解”数字的整数部分和“终止”它为分数input做好准备。
有一个先前的论文, n3499 ,告诉我们,虽然比亚尔本人build议空间作为分隔符:
虽然这种方法与一种常见的字体样式相一致,但是却存在一些兼容性问题。
- 它与pp-number的语法不匹配,并且最低限度地要求扩展该语法。
- 更重要的是,当范围[af]中的hex数字跟在一个空格之后时,会有一些句法歧义。 预处理器不知道是否在空格之后开始执行符号replace。
- 这可能会使编辑工具抓住“文字”不太可靠。
我想下面的例子是主要的问题:
const int x = 0x123 a;
尽pipe在我看来,这个理由相当薄弱。 我仍然无法想象一个真实世界的例子来打破它。
“编辑工具”的基本原理更糟糕,因为1'234
基本上打破了人类已知的每一种语法突出显示(例如Markdown在上述问题本身中使用的突出显示!),并使得更新版本的荧光笔更难以实现。
尽pipe如此,无论好坏,这是导致采用撇号的理由。
不使用空白的显而易见的原因是新的一行也是空白的,C ++对所有的空白进行相同的处理。 另外,我不知道任何接受任意空格的语言作为分隔符。
据推测,可以使用Unicode 0xA0(non-breaking space) – 这是排版时使用最广泛的解决scheme。 然而,我看到了两个问题:首先,它不是基本字符集,其次,它不是视觉上的独特性; 通过在普通编辑器中查看文本,你不能看到它不是一个空间。
除此之外,没有太多的select。 你不能使用逗号,因为这已经是一个合法的标记了(类似于1,234
是目前合法的C ++,意思是234)。 而在可能以法律forms出现的情况下,例如a[1,234]
。 虽然我不能想象任何实际的代码实际上使用这个,但是有一个基本的规则,就是没有合法的程序,不pipe多么荒谬,都应该默默地改变语义。
类似的考虑意味着_
也不能被使用; 如果有#define _234 * 2
,那么a[1_234]
会默默地改变代码的含义。
我不能说我对select'
特别满意'
,但它确实有在欧洲大陆使用的优势,至less在某些types的文本中。 (例如,我似乎记得曾经用德语看过它,尽pipe在典型的正文中,德语和大多数其他语言一样,会使用一个点或一个非破坏性的空间,但也许是瑞士德语)。parsing; 序列'1'
已经是合法的, '123'
。 所以像1'234
这样的东西可能是1
,然后是一个字符常量的开始; 我不知道你有多远才能作出决定。 没有一个合法的C ++序列,在这个序列中,一个整型常量后面跟着一个字符常量,所以破坏合法代码没有问题,但这意味着词法扫描突然变得非常依赖于上下文。
(关于你的评论:在select小数或千位分隔符时没有任何逻辑,例如十进制分隔符当然不是一个句号,它们只是任意的约定。
从维基 ,我们有一个很好的例子:
auto floating_point_literal = 0.000'015'3;
在这里,我们有.
然后如果另一个操作员会被满足,我的眼睛会等待一些可见的东西,比如逗号或什么东西,而不是空白。
所以这里的撇号比空白的要好得多。
随着空白,这将是
auto floating_point_literal = 0.000 015 3;
这与撇号的情况不一样。
按照阿尔伯特·伦肖 ( Albert Renshaw)的回答 ,我认为这个撇号比轨道上的亮度种族所提出的空间更清楚。
type a = 1'000'000'000'000'000'544'445'555; type a = 1 000 000 000 000 000 544 445 555;
空间用于很多事情,比如OP所提到的string连接,不同于撇号,在这种情况下,对于用来分隔数字的人来说,空格是明确的。
当代码行数变多时,我认为这会提高可读性,但是我怀疑这是他们select它的原因。
关于空间,可能值得看看这个C的问题 ,它说:
语言不允许int i = 10 000;
(整数字面量是一个标记,干预的空白将其分成两个标记),但是通常将初始化程序expression为文字计算的expression式通常几乎没有花费:
int i = 10 * 1000; /* ten thousand */
我确实没有看到实际的意义:
if (a == 1 1 1 1 1) ...
所以数字可能会合并而没有真正的歧义,但hex数字呢?
0 x 1 a B 2 3
没有办法消除拼写错误(通常我们应该看到一个错误)
我认为这是因为,在编写代码时,如果达到“行”(屏幕宽度)的末尾,会发生自动换行符(或“换行”)。 这将导致你的int分成两半,一半在第一行,第二个在第二行,这样它们在一个word-wrap
的情况下都保持在一起。
这与语言如何被parsing有关。 编译器作者很难重写他们的产品来接受空间分隔的文字。
另外,我不认为用空格分隔数字是很常见的。 我已经看到,即使在不同的国家,它总是非空白的字符。
- Parallel.ForEach与Task.Run和Task.WhenAll
- 返回64位整数中所有设置位的位置的最快方法是什么?
- “解引用types指针会打破严格别名规则”警告
- 在C#中将数据表转换为JSON
- 在事件派发之前检查null …线程安全吗?
- 将.net Func <T>转换为.netexpression式<Func <T >>
- C#:“types'System.InvalidOperationException'的第一个机会exception”
- 为什么使用C#类System.Random而不是System.Security.Cryptography.RandomNumberGenerator?
- 参数可以保持不变?