87

在一次采访中,我遇到了这样一个问题:

你的朋友给了你一个在控制台上打印斐波那契数字的源代码文件。注意 main() 块是空的,里面没有任何语句。

解释这是怎么可能的(提示:全局实例!)

我真的很想知道,这怎么可能!

4

6 回答 6

128

它最有可能实现为(或其变体):

 void print_fibs() 
 {
       //implementation
 }

 int ignore = (print_fibs(), 0);

 int main() {}

在这段代码中,全局变量ignore必须在进入main()函数之前进行初始化。现在为了初始化全局,print_fibs()需要在你可以做任何事情的地方执行——在这种情况下,计算斐波那契数并打印它们!我在以下问题中展示了类似的东西(我很久以前就问过):

请注意,这样的代码是不安全的,一般情况下最好避免使用。例如,std::cout对象在执行时可能没有被初始化print_fibs(),如果是这样,那么函数中会std::cout做什么?但是,如果在其他情况下,它不依赖于这样的初始化顺序,那么调用初始化函数是安全的(这是 C 和 C++ 中的常见做法)。

于 2013-07-08T15:17:33.133 回答
18

希望这可以帮助

class cls
{
  public:
    cls()
    {
      // Your code for fibonacci series
    }
} objCls;

int main()
{
}

因此,一旦声明了类的全局变量,就会调用构造函数并在其中添加逻辑以打印出斐波那契数列。

于 2013-07-08T15:17:15.773 回答
9

对的,这是可能的。您需要在对象构造函数中声明一个计算斐波那契数的对象的全局实例。

于 2013-07-08T15:16:57.473 回答
4

我知道一些像你讲的例子。获得它的一种方法是使用模板元编程。使用它,您可以将一些计算过程移动到编译中。

在这里你可以得到一个斐波那契数列的例子

如果您在静态类构造函数中使用它,您可以编写数字而无需在主函数中编写任何代码。

希望它可以帮助你。

于 2013-07-08T15:21:07.157 回答
3

在全局/静态变量的初始化过程中可能会发生一些事情。该代码将在应用程序启动时触发。

于 2013-07-08T15:16:56.940 回答
3

文件范围对象的所有 [*] 构造函数在到达之前被调用main,非对象文件范围变量的所有初始化表达式也是如此。

编辑:此外,所有文件范围对象的所有 [*] 析构函数在main退出后以相反的构造顺序调用。从理论上讲,您可以将您的斐波那契程序放入对象的析构函数中。

[*] 请注意,'all' 忽略了动态加载和卸载程序未直接链接的库的行为。但是,从技术上讲,这些不在基本 C++ 语言范围内。

于 2013-07-08T15:17:07.310 回答