有没有办法在带有空格C++源代码中写入大量数字以使其更具可读性?



想象一下我有代码:

vector<int> temp = vector<int>(1 000 000 000);

以上不会编译,因为编译器会抱怨空格。是否可以指示C++在编译时省略这些空格,或以其他方式使数字更易于阅读?

尝试使用数字分隔符:

int i = 1'000'000'000;

此功能自 C++14 开始引入。它使用单引号('(作为数字分隔符。


另请参阅:

  • 为什么没有为 C++14 位分隔符选择空格字符?
  • 概括重载 C++2000 (四月的笑话由C++父亲本人(

当我在没有 C++14 的平台上做类似的事情(通常用于微处理器(时,我通过乘法将其拆分来表示大数字:

int i = (1000 * 1000 * 1000);

添加ULL后缀以调味

这里的优点是它基本上兼容任何支持 C89(可能更早(的平台。

通常,假设乘法运算符在编译时会掉落可能是安全的,但是如果您在循环中使用这样的常量,则可能值得仔细检查。

我通常为此目的 #define 常量,因为它可以节省零计数,并非常清楚地表明您对查看代码的任何人意味着什么。例如

#define THOUSAND 1000
#define MILLION 1000000
vector<int> temp = vector<int>(THOUSAND * MILLION);

这清楚地表明我确实是指一亿,并没有错误地计算零

显然,如果您愿意,您可以使用枚举。

另一个想法可能是:

#define _000 *1000
int k = 1 _000 _000;

如果您不使用 C++14,另一种选择是使用某种字符串继承的类,该类具有隐式 int-cast,也许在构造函数中使用正则表达式检查来限制数字。 我用CString作为一个简单的例子。

class NumString : public CString
{
public:
NumString(CString number) : num(number) { } //maybe insert some regex-check here
operator long() const
{
CString tmp = num;
tmp.Remove(' ');        
return atol(tmp);
}
private:
CString num;
};

NumString a = "1 000 000 000";
int b = a;
bool test = b == 1000000000;
//test will be true

因为这让我想起了没有 C++14
的情况下对我的第一个笨拙方法进行数字分组

#define INTGROUPED1(a)     (a%1000)
#define INTGROUPED2(a,b)   (a%1000*1000 + b%1000)
#define INTGROUPED3(a,b,c) (a%1000*1000000 + b%1000*1000 + c%1000)
int v1 = INTGROUPED1(        123);
int v2 = INTGROUPED2(    123,123);
int v3 = INTGROUPED3( 23,123,123);

但我会在私人环境中使用这样的技巧。

只是考虑有人写

INTGROUPED3(1234,1234,1234); //This would be (234,234,234) without a compiler complaining

编辑1:

也许更好的方法是使用 ## 预处理器运算符

#define NUM_GROUPED_4ARGS(a,b,c,d) (##a##b##c##d)
int num = NUM_GROUPED_4ARGS(-2,123,456,789); //int num = (-2123456789);

这更像所见即所得,但不能免于滥用。 例如,您可能希望编译器抱怨

int num = NUM_GROUPED_4ARGS(-2,/123,456,789);  //int num = (-2/123456789); 

但事实并非如此。

最新更新