Представление больших чисел в исходном коде для удобочитаемости?

Есть ли более человечно читаемый способ представления больших чисел в исходном коде приложения, написанного на C ++ или C?

давайте, например, возьмем номер 2 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 2,345,879,444,641 .

Это более читаемо для человеческого глаза.

Есть ли для этого эквивалент C или C ++?

Вот макрос, который бы это сделал, проверенный как на 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. исправить 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, то есть текущей магистрали.
  2. лоббировать группы стандартизации C & C ++, чтобы получить это в будущих стандартах C или C ++.
  • Как использовать #if внутри #define в препроцессоре C?
  • Есть ли способ переносить сообщение из препроцессора C?
  • Можно ли использовать препроцессор C, чтобы определить, существует ли файл?
  • Использование X-Macros в реальном мире
  • Должен ли я использовать константы над определениями?
  • В чем разница между #define и const?
  • Перегрузка макроса по количеству аргументов
  • Когда macros C ++ полезны?
  • C ++ concat два строковых литерала `const char`
  • MSVC не расширяет __VA_ARGS__ правильно
  • Как определить платформу / компилятор из макросов препроцессора?
  • Давайте будем гением компьютера.