为什么C解析器不允许整数文本的数字之间有空格?

为什么C解析器不允许整数文本的数字之间有空格?,c,C,我希望它会打破一些其他的解析,但这并没有立即浮现在我的脑海中 例如,如果我这样说: #include <stdio.h> int main() { int i = 10 000; printf("%d\n", i); return 0; } 我认为这将是一个特性,也就是说,用数千个分隔符“眼解析”大整数更容易。 我正在使用一个最新的GCC,并假设其他编译器/解析器/词法分析器也是如此;无论是哪个对象。该语言不允许这样做(整数文本是一个标记,中间的空格将其拆分

我希望它会打破一些其他的解析,但这并没有立即浮现在我的脑海中

例如,如果我这样说:

#include <stdio.h>
int main()
{
    int i = 10 000;
    printf("%d\n", i);
    return 0;
}
我认为这将是一个特性,也就是说,用数千个分隔符“眼解析”大整数更容易。
我正在使用一个最新的GCC,并假设其他编译器/解析器/词法分析器也是如此;无论是哪个对象。

该语言不允许这样做(整数文本是一个标记,中间的空格将其拆分为两个标记),但将初始值设定项表示为一个计算文本的表达式通常不会产生什么费用:

int i = 10 * 1000; /* ten thousand */

该语言不允许这种情况(整型文字是一个标记,中间的空格将其拆分为两个标记),但将初始值设定项表示为文字计算的表达式通常不会产生任何费用:

int i = 10 * 1000; /* ten thousand */

<>这将与C++提出的能力冲突。

(是的,我知道这不是一个严肃的提议)

编辑:这只是一个愚蠢的事情上面,我真正的意见是下面的部分

对我来说,在数字中添加空格的能力既可以提高可读性,也可以降低可读性。如果您需要自己阅读这些数字,这可能会使阅读更容易。但我认为这也会使代码的阅读速度变慢,因为你必须在头脑中多做一步解析代码,而不仅仅是看标记的末尾。假设你在阅读时对数字的实际值不感兴趣


我不认为有任何技术上的原因不能做到这一点,更多的是人们把数字看作是一个不可分割的符号,所以应该这样写。我不得不说,我不知道为什么,但看到代码中的数字像这样被分解,我会很恼火。我不能说有一个很好的理由,但是它仍然是真实的:它可能正是我所习惯的。

< P>它会与C++所提出的能力相冲突。 (是的,我知道这不是一个严肃的提议)

编辑:这只是一个愚蠢的事情上面,我真正的意见是下面的部分

对我来说,在数字中添加空格的能力既可以提高可读性,也可以降低可读性。如果您需要自己阅读这些数字,这可能会使阅读更容易。但我认为这也会使代码的阅读速度变慢,因为你必须在头脑中多做一步解析代码,而不仅仅是看标记的末尾。假设你在阅读时对数字的实际值不感兴趣


我不认为有任何技术上的原因不能做到这一点,更多的是人们把数字看作是一个不可分割的符号,所以应该这样写。我不得不说,我不知道为什么,但看到代码中的数字像这样被分解,我会很恼火。我不能说有什么好的理由,但这仍然是真的:)这可能正是我所习惯的。

解析器不允许这样做,因为标准是这样规定的。在Ada中,您可以像在10_000中一样使用下划线。在Ada中,解析器不允许这样做,因为标准是这样规定的。在Ada中,您可以像在10_000中一样使用下划线。这是否编译为相同的代码?或者乘法的计算也会是二进制的吗?@Nodody:这取决于实现。在gcc上,生成的汇编程序在这两种情况下都使用常量
10000
,即使在
-O0
上也是如此。这意味着GCC甚至不认为这是一个优化。@ CharlesBailey你的解决方案<代码> 10×000 <代码>是好的,但是关于<代码> 41196312 <代码>呢?我不喜欢
41*1000*1000+196*1000+312
。是否会考虑为解析器增加不必要的复杂性?也许,也有人反对代码中的神奇数字?@user710408:你不会在计算41196312中的数字时迷失方向,因为这不是一个一模一样的零流,这正是我要解决的用例。我想,如果你想把事情搞砸,你可以使用令牌粘贴。e、 g.
#定义MY#CONST(41#196#312)
int i=MY#CONST。顺便问一下,41196312的起源是什么?“我不能马上看到任何熟悉的东西。”查理贝利首先,谢谢你的回答,查尔斯,非常感谢<代码>41 196 312
是人类7号染色体上一个已知基因的基因组坐标。这似乎已经演变成了一场关于将数字分组成大整数是否有帮助的辩论。我很惊讶,因为我会认为这是一个给定的,这当然是常见的做法。因为唯一的答案似乎是因为标准上这么说,所以我会接受它!这是否编译为相同的代码?或者乘法的计算也会是二进制的吗?@Nodody:这取决于实现。在gcc上,生成的汇编程序在这两种情况下都使用常量
10000
,即使在
-O0
上也是如此。这意味着GCC甚至不认为这是一个优化。@ CharlesBailey你的解决方案<代码> 10×000 <代码>是好的,但是关于<代码> 41196312 <代码>呢?我不喜欢
41*1000*1000+196*1000+312
。是否会考虑为解析器增加不必要的复杂性?也许,也有人反对代码中的神奇数字?@user710408:你不会在计算41196312中的数字时迷失方向,因为这不是一个一模一样的零流,这正是我要解决的用例。我想,如果你想把事情搞砸,你可以使用令牌粘贴。e、 g.
#定义MY#CONST(41#196#312)
int i=MY#CONST。顺便问一下,41196312的起源是什么?“我不能马上看到任何熟悉的东西。”查理贝利首先,谢谢你的回答,查尔斯,非常感谢
41 196 312
是一个已知基因的基因组坐标