【问题标题】:Why does the C parser not allow spaces between the digits of an integer literal?为什么 C 解析器不允许整数文字的数字之间有空格?
【发布时间】:2011-12-03 12:33:19
【问题描述】:

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

例如如果我这样说:

#include <stdio.h>
int main()
{
    int i = 10 000;
    printf("%d\n", i);
    return 0;
}

我的编译器是这样说的:

ctest.c:5: error: expected ‘,’ or ‘;’ before numeric constant

我认为这将是一个功能,即使用数千个分隔符“眼睛解析”大整数更容易。 我正在使用最近的 GCC,并假设其他编译器/解析器/词法分析器也是如此;无论是哪个对象。

【问题讨论】:

  • 解析器不允许这样做,因为标准是这样规定的。
  • 在 Ada 中,您可以像在 10_000 中一样使用下划线

标签: c


【解决方案1】:

该语言不允许这样做(整数文字是一个标记,中间的空格将其分成两个标记)但是将初始化程序表示为一个计算文字的表达式通常几乎不会产生任何费用:

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

【讨论】:

  • 这会编译成相同的代码吗?还是乘法的计算也是二进制的?
  • @Nodody:这取决于实现。在 gcc 上,常量10000 在这两种情况下都用于生成的汇编程序中,即使在-O0 中也是如此。这意味着 gcc 甚至不认为这是一种优化。
  • @CharlesBailey 您对10 * 000 的解决方案很好,但是41196312 呢?我不是41 * 1000 * 1000 + 196 * 1000 + 312 的粉丝。是否会考虑为解析器增加不必要的复杂性?也许,还有反对代码中的幻数的情绪?
  • @user710408:计数 41196312 中的数字不会迷失方向,因为它不是我要解决的用例的相同零流。我想,如果你想把事情分解,你可以使用令牌粘贴。例如#define MY_CONST (41 ## 196 ## 312)int i = MY_CONST;。顺便说一句,41196312 的由来是什么?我无法立即看到任何熟悉的内容。
  • @CharlesBailey 首先,感谢您的回复,查尔斯,非常感谢。 41 196 312 是人类 7 号染色体上一个众所周知的基因的基因组坐标。这似乎已经退化为关于将数字分组为大整数是否有帮助的争论。我很惊讶,因为我认为这是给定的,这当然是常见的做法。由于即将出现的唯一答案是因为 标准 所以我'我会接受的!
【解决方案2】:

这会与为 c++ 提议的overload the space operator 的能力相冲突。

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

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

对我来说,将空格放在数字中的能力会增强和降低可读性。如果您需要自己阅读数字,这可能会使这样做更容易。但我认为这也会使代码的阅读速度变慢,因为您必须在头脑中多花一步来解析代码,而不仅仅是查看令牌的末尾。假设您在阅读时对数字的实际值不感兴趣。

我不认为有任何技术原因无法做到这一点,更多的是人们将数字视为单个不可分割的标记,因此应该这样写。我不得不说我不完全知道为什么,但是看到代码中的数字像这样分解会让我很恼火。我不能说这是有充分理由的,但它仍然是真的:) 这可能正是我所习惯的。

【讨论】:

  • 该提案是 C++ 提案;这个问题是关于 C 的。你建议的潜在冲突不相关。
  • 嗯,好的。是的。无论如何,这不是一个严肃的提议,这是一个愚人节玩笑之类的。另外,无论如何,这只是对我的主要观点的愚蠢评论。
  • 如果 C 将其实现为某种魔术标记连接,则 C++ 将遇到运算符重载机制的问题。在10 012 中,第二个字面量是八进制,需要一些非常特殊的魔法才能达到预期效果。
  • 但是 c++ 空间运算符重载不是/不可能是严重的,可以吗?!所以这不排除在整数中有空格分隔符?
  • @JohnB 如果您对数字的价值不感兴趣,那么显然将其拆分没有任何优势。如果您对数字的大小感兴趣,例如数百万或数百万,那么我发现它非常有帮助。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2010-11-13
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多