Представление больших чисел в исходном коде для удобочитаемости?
Есть ли более человечно читаемый способ представления больших чисел в исходном коде приложения, написанного на C ++ или C?
давайте, например, возьмем номер 2 2,345,879,444,641
, на C или C ++, если мы хотим, чтобы программа вернула это число, мы return 2345879444641
.
Но это не совсем понятно.
- Макро против функции в C
- Массив общей длины массива для C?
- Как надежно определить Mac OS X, iOS, Linux, Windows в препроцессоре C?
- Что означает «#define STR (a) #a»?
- Как я могу генерировать уникальные значения в препроцессоре C?
Например, в PAWN (язык сценариев) я могу return 2_345_879_444_641
или даже return 2_34_58_79_44_46_41
и оба они вернут номер 2 2,345,879,444,641
.
Это более читаемо для человеческого глаза.
Есть ли для этого эквивалент C или C ++?
- Можно ли перебирать аргументы в переменных массивах?
- Каковы допустимые символы для имен макросов?
- Как объединить два раза с препроцессором C и развернуть макрос, как в «arg ## _ ## MACRO»?
- Как проверить ОС с помощью директивы препроцессора?
- Выход препроцессора Xcode
- Почему большинство разработчиков C используют определение вместо const?
- Запятая в макросе C / C ++
- Как создать новую строку в макросе cpp?
Вот макрос, который бы это сделал, проверенный как на 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;
С текущим компилятором (C ++ 14 или новее) вы можете использовать апострофы, например:
auto a = 1'234'567;
Если вы все еще придерживаетесь C ++ 11, вы можете использовать пользовательский литерал для поддержки чего-то вроде: int i = "1_000_000"_i
. Код будет выглядеть примерно так:
#include #include #include 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; }
Поскольку я написал это, это поддерживает символы подчеркивания или запятые взаимозаменяемо, поэтому вы можете использовать один или другой, или и то, и другое. Например, «1000_000» получится 1000000
.
Конечно, европейцы, вероятно, предпочли бы ». вместо «,» - если это так, не стесняйтесь изменять, как вы сочтете нужным.
С 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. Оставленный как упражнение (а также потому, что он требует больше кода).
Для C ++ 1y вы можете использовать одиночную кавычку ( '
) в качестве разделителя цифр. Основываясь на N3781: Единый котировочный знак как разделитель цифр, который, наконец, был принят . Оба gcc и clang поддерживают эту функцию как часть их реализации C ++ 1y .
Итак, следующая программа ( см. Его живую для clang ):
#include int main(){ std::cout << 2'345'879'444'641 << std::endl ; }
выведет:
2345879444641
Вы можете использовать макрос препроцессора
#define BILLION (1000*1000*1000)
затем код, например (4*BILLION)
; если вы заботитесь о большой мощности двух просто ust 1<<30
PS Обратите внимание, что 1e6
является double
литералом (таким же, как 1.0e6
)
И вы также можете:
- исправить
1_234_567
GCC, чтобы принять нотацию1_234_567
для1_234_567
литералов и опубликовать этот патч для соответствия GPLv3 и духу свободного программного обеспечения.
вероятно, в файлеlibpp/lex.c
и / илиgcc/c-family/c-lex.c
и / илиgcc/cpp/lex.c
будущего GCC 4.8, то есть текущей магистрали. - лоббировать группы стандартизации C & C ++, чтобы получить это в будущих стандартах C или C ++.