5

私はプログラミングに非常に慣れておらず、voidが何をするのか混乱しています。関数の前にvoidを置くと、「何も返さない」という意味ですが、関数が何も返さない場合、関数を書く意味は何ですか? ?とにかく、私は宿題でこの質問を受け取り、それに答えようとしていますが、それと一緒に一般的な概念についていくつかの助けが必要です。どんな助けでも素晴らしいでしょう、そして技術用語を避けてみてください、私はここで真面目な初心者です。

この機能は何を達成しますか?

void add2numbers(double a, double b) 
    { 
       double sum; 
       sum = a + b; 
    }
4

10 に答える 10

8
void ReturnsNothing() 
{
     cout << "Hello!";
}

ご覧のとおり、この関数は何も返しませんが、関数が何もしないという意味ではありません。

関数は、一般的に使用されるルーチンをまとめるためのコードのリファクタリングにすぎません。「Hello」を頻繁に出力する場合は、「Hello」を出力するコードを関数に入れます。2 つの数値の合計を計算する場合は、それを実行するコードを記述し、結果を関数で返します。それはすべてあなたが望むものです。

于 2012-05-21T18:53:28.803 に答える
5

void 関数を使用する理由はたくさんありますが、その中には「非純粋」な副作用があるものもあります。

int i=9;
void f() {
    ++i;
}

この場合i、グローバルまたはクラス データ メンバーの可能性があります。

もう一つは目に見える効果

void f() {
    std::cout <<"hello world" << std::endl;
}

void 関数は、参照またはポインター値に対して作用する場合があります。

void f(int& i) {
   ++i;
}

スローすることもできますが、フロー制御のためにこれを行わないでください。

void f() {
   while(is_not_broke()) {
        //...
   }
   throw std::exception(); //it broke
}
于 2012-05-21T18:54:53.180 に答える
3

void 関数の目的は、値を返すのではなく、副作用 (たとえば、参照パラメーターまたはグローバル変数の変更、I/O などのシステム コールの実行など) を実現することです。

于 2012-05-21T18:53:26.643 に答える
2

C/C++ のコンテキストでの関数という用語の使用は、「値を返すもの」としての関数の数学的概念に同意しないため、かなり紛らわしいものです。C/C++ がvoid を返す関数を呼び出すものは、他の言語のプロシージャの概念に対応します。

関数とプロシージャの主な違いは、関数呼び出しはであり、プロシージャ呼び出しはステートメントであるということです。関数は戻り値のために呼び出されますが、プロシージャは副作用(出力の生成、状態の変更、等々)。

于 2012-05-21T18:56:54.580 に答える
1

戻り値が void の関数は、その副作用に役立ちます。たとえば、標準ライブラリ関数を考えてみましょうexit:

void exit(int status)

この関数は値を返しませんが、プロセスを終了するという副作用には役立ちます。

于 2012-05-21T18:54:09.990 に答える
1

その関数は何も達成しません-しかし、あなたが書いたなら

void add2numbers(double a, double b, double &sum) 
{        
   sum = a + b; 
}

値を返す方が簡単か、パラメーターを使用する方が簡単かは、関数によって異なりますが、合計が得られます

通常、複数の結果がある場合はパラメーターを使用しますが、答えが得られない可能性がある数学ルーチンがあるとします。

bool sqrt(double value, double &answer)
{
   if value < 0.0 ) {
      return false;
   } else {
      answer = real_sqrt_function(value);
      return true;
   }
}
于 2012-05-21T18:54:12.247 に答える
1

この場合、関数は少し誤解されています。おそらくそれをメソッドと呼ぶ方が良いでしょう。オブジェクトのメソッドを呼び出して、その状態、つまりフィールド (またはプロパティ) の値を変更できます。したがって、x 座標と y 座標のプロパティを持つオブジェクトと、パラメーター xDelta と yDelta を受け取る Move というメソッドがあるとします。

Move を 2, 3 で呼び出すと、2 が X プロパティに追加され、3 が Y プロパティに追加されます。そのため、オブジェクトの状態が変化したため、Move が値を返してもあまり意味がありません。

于 2012-05-21T19:04:12.413 に答える
1

あなたは正しい行にいます-関数は何かを計算しますが、何かが捨てられるため、何も達成しません。

void を返す関数は、"副作用" があるため便利です。これは、関数の入力または出力ではない何かが発生することを意味します。たとえば、ファイルに書き込んだり、電子メールを送信したりできます。

于 2012-05-21T18:55:57.437 に答える
0

あなたは完全に正しいです:何も返さない関数を計算することは無意味です-あなたが数学関数について話しているなら。しかし、多くの数学の概念と同様に、「関数」は多くのプログラミング言語では数学関数にのみ関連していますが、動作は多少異なります。

誤解しない言語で説明するのは良いことだと思います。そのような言語の1つがHaskellです。これは純粋に関数型言語であり、Haskell関数も数学関数であることを意味します。実際、Haskell関数をもっと数学的なスタイルで書くことができます。

my_tan(x) = sin(x)/cos(x)          -- or (preferred):    tan' x = sin x / cos x

C++よりも

double my_tan(double x) { return sin(x)/cos(x); }

しかし、コンピュータプログラムでは、関数を計算するだけではありませんか?また、画面に何かを表示したり、ネットワーク経由でデータを送信したり、センサーから値を読み取ったりするなどの作業も行います。Haskellでは、これらのようなものは純粋関数から十分に分離されており、すべていわゆるIOモナドで機能します。 。たとえば、putStrLn文字の行を出力する関数のタイプはString -> IO()。です。Stringつまり、引数としてaを取り、関数IOから呼び出されたときにその文字列を出力するアクションを返しますが、それ以外は何も返しません(親はおおよそC ++にあるものです)。main()void

このIOの実行方法には多くの利点がありますが、ほとんどのプログラミング言語はより雑然としています。すべての関数でIOを実行でき、プログラムの内部状態を変更することもできます。したがって、C ++では、単純に関数を使用できます。この関数void putStrLn(std::string)は、文字列だけを出力するIOアクションを「返す」こともできますが、明示的には指示しません。利点は、IOモナドが実際に何であるかを考えるときに、脳内で複数の結び目を結ぶ必要がないことです(かなり回り道です)。また、実際にマシンに「この一連のプロセスを実行してください」と指示する機能があれば、多くのアルゴリズムを実装してより高速に実行できます。IOモナドでの計算結果を要求するだけではありません。

于 2012-05-21T19:39:05.293 に答える
0

現在、 VTKという可視化ライブラリを使用しています。私は通常、画面に表示されるグラフィックスの一部を更新するために void 関数を作成します。また、void 関数を使用して、Qt 内での GUI 操作を処理します。たとえば、ボタンをクリックすると、GUI で一部のテキストが更新されます。

于 2012-05-21T19:10:09.020 に答える