25

C ++またはCで記述されたアプリケーションのソースコードで大きな数を表現するための、より人間が読める方法はありますか?

たとえば2,345,879,444,641、プログラムでこの数値を返すようにしたい場合は、CまたはC++で数値を取得しますreturn 2345879444641

しかし、これは実際には読みにくいです。

たとえば、PAWN(スクリプト言語)では、私は実行できますがreturn 2_345_879_444_641return 2_34_58_79_44_46_41これらは両方とも数値を返し2,345,879,444,641ます。

これは人間の目にとってはるかに読みやすいです。

これに相当するCまたはC++はありますか?

4

5 に答える 5

32

現在のコンパイラ (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;
}

私が書いたように、これはアンダースコアまたはコンマを交換可能にサポートするため、どちらか一方、または両方を使用できます。たとえば、「1,000_000」は となり1000000ます。

もちろん、ヨーロッパ人はおそらく「.」を好むでしょう。「,」の代わりに -- その場合は、必要に応じて自由に変更してください。

于 2013-01-08T17:36:05.853 に答える
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

デモ

もう 1 つの方法は、UDL を作成することです。演習として残しました (また、より多くのコードが必要になるため)。

于 2013-01-08T17:10:33.743 に答える
7

これは、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;
于 2013-01-08T17:36:23.387 に答える
4

C++1y では、一重引用符 ( ') を桁区切り記号として使用できるようになりました。N3781 : Single-Quotation-Mark as a Digit Separatorに基づいており、最終的に受け入れられました。gccclangの両方が、 C++1y実装の一部としてこの機能をサポートしています。

したがって、次のプログラム(clang のライブを参照):

#include <iostream>

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

出力します:

2345879444641

于 2014-02-18T03:35:06.740 に答える
3

プリプロセッサ マクロを使用できます

  #define BILLION (1000*1000*1000)

次にコードを記述し(4*BILLION)ます。2 のべき乗が気になる場合は ust1<<30

PS1e6doubleリテラルであることに注意してください ( と同じ1.0e6)

また、次のこともできます。

  1. 数値リテラルの表記を受け入れるように GCC lexer に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++ 標準で受け入れられるようにします。
于 2013-01-08T17:03:31.603 に答える