想象一下我有代码:
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);
添加UL
或L
后缀以调味
这里的优点是它基本上兼容任何支持 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);
但事实并非如此。