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

16 c c++ c-preprocessor

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

例如2,345,879,444,641,如果我们想要一个程序返回我们要做的那个数字,那么就用C或C++中的数字来表示return 2345879444641.

但这不是真的可读.

例如,在PAWN(一种脚本语言)中,我可以做return 2_345_879_444_641甚至是return 2_34_58_79_44_46_41这两种语言都可以返回数字2,345,879,444,641.

对于人眼来说,这更具可读性.

这有C或C++的等价物吗?

Jer*_*fin 23

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

auto a = 1'234'567;
Run Code Online (Sandbox Code Playgroud)

如果您仍然坚持使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

当然,欧洲人可能更喜欢"." 而不是"," - 如果是这样,请随意修改,如你所愿.

  • +1.我写这篇文章,但你已经这样做了.这个解决方案唯一的问题是`"1_000"_i`不再是常量表达式了! (2认同)
  • C++14 及更高版本中的撇号为 +1。这个功能应该以某种方式变得更加引人注目,并且可能是当今的答案。 (2认同)

Cat*_*lus 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)
Run Code Online (Sandbox Code Playgroud)

用法:

NUM(123, 456, 789) // Expands to 123456789
Run Code Online (Sandbox Code Playgroud)

演示.

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


Jas*_*onD 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_
Run Code Online (Sandbox Code Playgroud)

使用它像:

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

生产:

int y = 12345678;
int x = 100460694;
Run Code Online (Sandbox Code Playgroud)


Sha*_*our 5

对于C++1y,您现在可以使用单引号 ( ') 作为数字分隔符。基于N3781:单引号作为数字分隔符,最终被接受gccclang都支持此功能作为其C++1y实现的一部分。

所以下面的程序(请查看 clang 的实时情况):

#include <iostream>

int main(){
    std::cout << 2'345'879'444'641 << std::endl ;
}
Run Code Online (Sandbox Code Playgroud)

将输出:

2345879444641