【问题标题】:Why isn't my C++ program running?为什么我的 C++ 程序没有运行?
【发布时间】:2013-03-07 16:07:37
【问题描述】:
#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 的控制台上生成。

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

程序不会崩溃。没有编译器错误或警告。事实上,这里有一个程序的演练:

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

然后我将nNextID初始化为0,将其递增,如果小于20则输出nNextID。函数到此结束。

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

【问题讨论】:

  • 这里的错误太多了。为自己准备一本 C++ 书籍/教程。
  • 打印所有数字的循环在哪里?
  • system("pause") 总是让我很沮丧。 stackoverflow.com/q/1107705/10077
  • @m0skit0:还不如链接The Definitive C++ Book Guide and List
  • Jossie,你观察到什么让你相信它没有运行?你期望输出是什么,你观察到什么输出?它会崩溃吗?它是否有任何编译器错误或警告?

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 还有return 0;。他也不能在没有循环的情况下打印数字 1-20(以微不足道的方式)。
  • 我解决了。谢谢大家,我没有注意到这个小错误。
  • @m0skit0:main不需要return语句,很特别。
  • @m0skit0: 成功返回是隐含的,不需要。
  • 只有main()不需要回车?看起来像是一个糟糕的行为决定......这是在哪个标准中添加的?这个决定背后的逻辑是什么?
【解决方案2】:

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

改为这样做:

GenerateID();

(即没有int)。

【讨论】:

    【解决方案3】:
    int GenerateID();
    

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

    要解决此问题,您应该这样做:

    GenerateID();
    

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


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

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

    std::cin.get();
    

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

    我希望这会有所帮助!

    【讨论】:

    • 或者你可以简单地使用std::cin.get()
    • 你为什么说using namespace std;不属于函数体内,而是属于全局范围?听起来对我来说是一个糟糕的建议。应鼓励限制该声明的范围。
    【解决方案4】:

    main 中的int GenerateID() 声明了一个新函数,它不会调用您之前编写的函数。

    为了调用你的函数,只需使用GenerateID();。顺便说一句,你的函数没有 return 任何东西,所以声明它的返回类型没有什么意义 int - 使用 void

    【讨论】:

      【解决方案5】:
      • 删除main中对GenerateID()的调用前面的int关键字。

      • 用循环包装这个调用:

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

      可选:

      • system 函数调用替换为this question 提供的解决方案之一,

      • 将显示 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 函数在退出时返回一个值(与任何返回某些内容的函数非常相似),如上面的代码所示,

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

      【讨论】:

        猜你喜欢
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        相关资源
        最近更新 更多