当前位置: 首页 > 面试题库 >

如何在编译时驱动C#,C ++或Java编译器来计算1 + 2 + 3 +…+ 1000?

吴才俊
2023-03-14
问题内容

在最近的一次采访中,有人问我一个非常奇怪的问题。面试官问我如何仅使用编译器功能来计算1 + 2 + 3 + … +
1000。这意味着我不允许编写程序并执行它,但我只应该编写一个程序,该程序可以驱动编译器在编译时计算此和,并在编译完成时打印结果。作为提示,他告诉我,我可能会使用编译器的泛型和预处理器功能。可以使用C
++,C#或Java编译器。有任何想法吗???

此问题与此处未询问任何循环的求和无关。另外,应该注意,总和应该在编译期间计算。使用C
++编译器指令仅打印结果是不可接受的。

阅读有关发布的答案的更多信息后,我发现在使用C 模板进行编译期间解决问题称为 metaprogramming 。这是Erwin
Unruh博士在标准化C
语言的过程中偶然发现的一项技术。您可以在meta-
programming的Wiki页面上阅读有关此主题的更多信息。似乎可以使用Java注释用Java编写程序。您可以在下面查看
maress的 答案。

关于用C元编程++一个很好的书是这一个。如果有兴趣的话值得一看。

Boost的MPL
这个链接是有用的C
++元编程库。


问题答案:

*立即 *更新, 具有改进的递归深度!无需增加深度即可在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
      ]


 类似资料:
  • 问题内容: 我试图编译以下代码: 当我尝试编译时,它抛出: 错误:(5,41)Java:不兼容的类型:可能从int到char的有损转换 问题是,它的工作,如果我写,或。 我检查了一下,尝试时编译器抛出了类似的错误,但是我看不到’c’的值可以在原始函数中通过’char’类型的最大值。 问题答案: 是一个,因为操作数经过二进制数值提升: 是一个 是一个 因此必须扩展以使其兼容添加;表达式的结果是。 至

  • 本文向大家介绍C/C++ 编译器优化介绍,包括了C/C++ 编译器优化介绍的使用技巧和注意事项,需要的朋友参考一下 0. gcc -o gcc -o 的优化仍然是机械的,想当然的。只有做到深入理解计算机系统,加深对编程语言的理解,才能写出最优化的代码。 Linux下gcc 优化级别的介绍  · gcc -o0 ⇒ 不提供任何优化;  · gcc -o1 ⇒ 最基本的优化,主要对代码的分支、表达式、

  • 由于声明为constexpr的函数有可能在运行时调用,编译器根据哪些条件决定是在编译时还是在运行时计算它? 在这种情况下,i在编译时是未知的,这可能是编译器将POW()视为在运行时调用的常规函数的原因。然而,这种动态,尽管看起来很方便,却有一些不切实际的含义。例如,会不会有这样一种情况,我希望编译器在编译时计算一个常数表达式函数,而编译器决定将其视为正常函数,而它在编译时也可以工作?有什么已知的常

  • 本文向大家介绍C++ 用Clang编译,包括了C++ 用Clang编译的使用技巧和注意事项,需要的朋友参考一下 示例 由于锵前端被设计为是与GCC兼容,当你交换可通过GCC编译大多数程序将编译g++通过clang++在构建脚本。如果没有-std=version给出,将使用gnu11。 习惯了MSVC的Windows用户可以cl.exe与交换clang-cl.exe。默认情况下,clang尝试与已安

  • 问题内容: 在编译C 时,您当然会为要编译的目标平台使用编译器。是否有针对JVM的C 编译器(因此,不是使用Java“本机”接口,而是将C ++代码编译为Java字节码)? 问题答案: NestedVM为Java字节码提供二进制转换。这是通过让GCC编译为MIPS二进制文件然后将其转换为Java类文件来完成的。因此,任何用C,C ++,Fortran或GCC支持的任何其他语言编写的应用程序都可以在