-3
#include <cstdlib>
#include <iostream>

    int GenerateID()
    {
        using namespace std;
        static int nNextID = 0;
        nNextID++;
        if (nNextID <= 20)
        cout << nNextID << endl;
    }

int main()
{
    int GenerateID();
    system("pause");
}

为什么上面的程序没有运行?我希望它使用该程序在 1-20 的控制台编号上生成。

事实上,程序正在运行。但是,该程序没有生成任何输出。我希望输出是由空格分隔的一行的1数字20。我观察到空白,即没有输出。

程序不会崩溃。没有编译器错误或警告。实际上,这是该程序的演练:

我导入了两个库,分别使用和为输入和输出对象cstdlib执行系统命令和。它们位于命名空间中,所以我输入,因为我很懒,不想输入.systemiostreamcincoutstdusing namespace stdstd::cout

然后我初始化nNextID0,增加它,如果它小于 20 它应该输出nNextID。这是函数的结束。

我调用该函数main并使用它pause来结束程序。1那么,当我期望在20一行上用空格分隔数字时,为什么会得到空白输出?

4

5 回答 5

6

你的主要功能应该是这样的:

int main()
{
    GenerateID();
    system("pause");
}
于 2013-03-07T16:08:39.890 回答
3

main中,您没有调用该函数。你只是宣布了它。

改为这样做:

GenerateID();

(即没有int)。

于 2013-03-07T16:09:10.783 回答
2
int GenerateID();

不是函数调用。这是一个函数声明,定义了函数的返回类型和参数。这不会调用 GenerateID 函数,它只会允许该定义下的所有内容正确使用该函数(这在此处非常多余,因为您首先已经在 int main 上方声明和定义了该函数。)

要解决此问题,您应该执行以下操作:

GenerateID();

那将是一个适当的函数调用。


我还想警告您有关系统功能的使用。出于快速和简单的测试目的,使用完全没问题,虽然有问题,但由于此功能非常依赖于操作系统,我建议不要使用它。

system("pause") 的替代方法是:

std::cin.get();

它不会显示文本,但无论哪种方式你都不需要。(谢谢大卫)

我希望这有帮助!

于 2013-03-07T16:17:19.723 回答
1

int GenerateID()inmain声明了一个新函数,它不会调用你之前写的函数。

为了调用你的函数,只需使用GenerateID();. 顺便说一句,您的函数没有return任何作用,因此声明其返回类型几乎没有意义int- use void

于 2013-03-07T16:08:41.803 回答
1
  • 删除int调用 in 前面GenerateID()的关键字main

  • 用循环包装那个调用:

    for (int i = 0; i < 20; i++) 
        GenerateID();
    

可选:

  • 用为此问题提供的解决方案之一替换您的system函数调用,

  • 将显示 id 的代码与生成它的代码分开:

    int GenerateID() {
        static int id = 0;
        return id++;
    }
    
    int main(){
        using namespace std;
        for (int i = 0; i < 20; i++)
            cout << GenerateID() << endl;
        // here the code for console pausing
        return 0;
    }
    
  • 让你的main函数在退出时返回一个值是一种很好的做法(就像任何返回某些东西的函数一样),如上面的代码所示,

  • 删除隐式命名空间使用,并使所有使用显式。就个人而言,只要隐式使用被隔离到代码的非常特定的部分,我不认为这是一个问题,但是如果您的代码变得足够大,您可能需要谨慎使用该功能。在此设置中,显然没有必要。

于 2013-03-07T16:22:11.613 回答