C#、C++、または Java コンパイラを駆動して、コンパイル時に 1+2+3+...+1000 を計算するにはどうすればよいでしょうか? 質問する

C#、C++、または Java コンパイラを駆動して、コンパイル時に 1+2+3+...+1000 を計算するにはどうすればよいでしょうか? 質問する

最近の面接で、本当に奇妙な質問を受けました。面接官は、コンパイラの機能だけを使って 1+2+3+...+1000 を計算するにはどうしたらよいかと尋ねました。つまり、プログラムを書いて実行するのではなく、コンパイル中にこの合計を計算し、コンパイルが完了したら結果を出力するようにコンパイラを駆動するプログラムを書くだけでよいということです。ヒントとして、コンパイラのジェネリックとプリプロセッサ機能を使用してもよいと言われました。C++、C#、または Java コンパイラを使用できます。何かアイデアはありますか?

この質問はループなしで合計を計算することとは関係ありませんここで質問さらに、合計はコンパイル時に計算される必要があることに注意してください。C++ コンパイラ ディレクティブを使用して結果だけを印刷することは受け入れられません。


投稿された回答を詳しく読んでみると、C++テンプレートを使用してコンパイル中に問題を解決することをメタプログラミングこれは、C++言語の標準化の過程で、アーウィン・ウンルー博士が偶然発見した手法です。このトピックの詳細については、メタプログラミングのウィキページJavaアノテーションを使用してJavaでプログラムを書くことは可能のようです。牝馬の下記に回答してください。

C++のメタプログラミングに関する良い本はこれです興味があれば一見の価値があります。

便利なC++メタプログラミングライブラリはBoostのMPLです。このリンク

ベストアンサー1

更新しました再帰の深さが改善されました。深さを増やすことなく、MSVC10 および GCC で動作します。:)


単純なコンパイル時の再帰 + 加算:

template<unsigned Cur, unsigned Goal>
struct adder{
  static unsigned const sub_goal = (Cur + Goal) / 2;
  static unsigned const tmp = adder<Cur, sub_goal>::value;
  static unsigned const value = tmp + adder<sub_goal+1, Goal>::value;
};

template<unsigned Goal>
struct adder<Goal, Goal>{
  static unsigned const value = Goal;
};

テストコード:

template<unsigned Start>
struct sum_from{
  template<unsigned Goal>
  struct to{
    template<unsigned N>
    struct equals;

    typedef equals<adder<Start, Goal>::value> result;
  };
};

int main(){
  sum_from<1>::to<1000>::result();
}

GCC の出力:

エラー: 'struct sum_from<1u>::to<1000u>::equals<500500u>' の宣言

Ideone のライブ例

MSVC10の出力:

error C2514: 'sum_from<Start>::to<Goal>::equals<Result>' : class has no constructors
      with
      [
          Start=1,
          Goal=1000,
          Result=500500
      ]

おすすめ記事