在用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 ++等价物?
答案 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
另一种方法是制作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 accepted。 gcc和clang都支持此功能,作为 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请注意1e6
是double
字面值(与1.0e6
相同)
你也可以:
1_234_567
表示法,并发布该补丁以符合GPLv3和自由软件精神。
libpp/lex.c
和/或gcc/c-family/c-lex.c
和/或gcc/cpp/lex.c
中,即当前主干。