在源代码中代表大数字以提高可读性?

时间:2013-01-08 17:01:34

标签: c++ c c-preprocessor

在用C ++或C编写的应用程序的源代码中,是否有更人性化的方式来表示大数字?

例如,如果我们想要一个程序返回这个数字{C}或C ++,请使用数字2,345,879,444,641

但这不是真的可读。

例如,在PAWN(脚本语言)中,我可以return 2345879444641甚至return 2_345_879_444_641,这两者都会返回数字return 2_34_58_79_44_46_41

这对人眼来说更具可读性。

这是否有C或C ++等价物?

5 个答案:

答案 0 :(得分:22)

使用当前编译器(C ++ 14或更高版本),您可以使用撇号,例如:

auto a = 1'234'567;

如果您仍然坚持使用C ++ 11,则可以使用用户定义的文字来支持以下内容:int i = "1_000_000"_i。代码看起来像这样:

#include <iostream>
#include <string>
#include <cstdlib>

int operator "" _i (char const *in, size_t len) { 
    std::string input(in, len);
    int pos;

    while (std::string::npos != (pos=input.find_first_of("_,"))) 
        input.erase(pos, 1);

    return std::strtol(input.c_str(), NULL, 10);
}

int main() { 
    std::cout << "1_000_000_000"_i;
}

正如我所写,它可以互换地支持下划线或逗号,因此您可以使用其中一个或两个,或两者兼而有之。例如,&#34; 1,000_000&#34;结果为1000000

当然,欧洲人可能更喜欢&#34;。&#34;而不是&#34;,&#34; - 如果是这样,请随意修改。

答案 1 :(得分:12)

使用Boost.PP

#define NUM(...) \
    NUM_SEQ(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) 
#define NUM_SEQ(seq) \
    BOOST_PP_SEQ_FOLD_LEFT(NUM_FOLD, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq)) 
#define NUM_FOLD(_, acc, x) \
    BOOST_PP_CAT(acc, x)

用法:

NUM(123, 456, 789) // Expands to 123456789

Demo

另一种方法是制作UDL。留作练习(也因为它需要更多代码)。

答案 2 :(得分:5)

这是一个宏,可以在MSVC和GCC上进行测试。不依赖Boost ......

#define NUM(...) NUM_(__VA_ARGS__, , , , , , , , , , )
#define NUM_(...) NUM_MSVCHACK((__VA_ARGS__))
#define NUM_MSVCHACK(numlist_) NUM__ numlist_
#define NUM__(a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, ...) a1_##a2_##a3_##a4_##a5_##a6_##a7_##a8_

使用它像:

int y = NUM(1,2,3,4,5,6,7,8);
int x = NUM(100,460,694);

产地:

int y = 12345678;
int x = 100460694;

答案 3 :(得分:4)

对于 C ++ 1y ,您现在可以使用单引号(')作为数字分隔符。基于N3781: Single-Quotation-Mark as a Digit Separator finally been acceptedgccclang都支持此功能,作为 C ++ 1y 实现的一部分。

以下程序( see it live for clang ):

#include <iostream>

int main(){
    std::cout << 2'345'879'444'641 << std::endl ;
}

将输出:

  

2345879444641

答案 4 :(得分:3)

您可以使用预处理器宏

  #define BILLION (1000*1000*1000)

然后代码,例如(4*BILLION);如果你只关心两个人的大功率1<<30

PS请注意1e6double字面值(与1.0e6相同)

你也可以:

  1. 修补GCC词法分析器以接受数字文字的1_234_567表示法,并发布该补丁以符合GPLv3和自由软件精神。
    可能位于未来GCC 4.8的文件libpp/lex.c和/或gcc/c-family/c-lex.c和/或gcc/cpp/lex.c中,即当前主干。
  2. 游说C&amp; C ++标准化组将在未来的C或C ++标准中接受。