-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行の数字1になると思います。20空白、つまり出力がないことを確認します。

プログラムはクラッシュしません。コンパイラのエラーや警告はありません。実際、プログラムのウォークスルーは次のとおりです。

入力オブジェクトと出力オブジェクト、およびをそれぞれcstdlib使用してシステムコマンドを実行するために、2つのライブラリをインポートします。それらは名前空間にあるので、私は怠惰でタイプしたくないのでタイプします。systemiostreamcincoutstdusing namespace stdstd::cout

次に、に初期化nNextIDして0インクリメントします。20未満の場合は、を出力しますnNextID。これで関数は終了です。

私はその関数をから呼び出し、プログラムを終了するためにmain使用します。それで、スペースで区切られた数字の行を期待しているpauseのに、なぜ空白の出力が表示されるのですか?120

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の呼び出しの前にあるキーワードを削除GenerateID()mainます。

  • その呼び出しをループでラップします。

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

オプション:

  • 関数呼び出しを、この質問system提供されているソリューションの1つに置き換えてください。

  • コードを分離して、IDを生成するコードから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 に答える