void f()
f
何も返さないことを意味します。何も返さない場合void
、なぜそれを使用するのでしょうか? の主な目的はvoid
何ですか?
11 に答える
C が発明されたとき、戻り値の型を指定しない場合、コンパイラは自動的に an を返したいと推論するという慣習がありましたint
(パラメーターについても同じことが言えます)。
しかし、多くの場合、何らかの処理を行い、何も返す必要がない関数を作成します (たとえば、画面に何かを出力するだけの関数について考えてみてください)。このため、何も返したくないことを指定するには、void
キーワードを「戻り値の型」として使用する必要があると判断されました。
void
他の目的にも役立つことに注意してください。特に:
関数へのパラメーターのリストとして指定すると、関数はパラメーターを取らないことを意味します。これは C で必要でした。パラメーターのない関数宣言は、パラメーター リストが単に指定されていないままであることをコンパイラーに意味するためです。C++ では、空のパラメーター リストは関数にパラメーターが許可されていないことを意味するため、これは不要になりました。
void
ポインターでも重要な役割を果たします。void *
(およびそのバリエーション)は、「指定されていないものへのポインタ」を意味します。これは、ポインターを実際に使用せずに格納/受け渡しする必要がある関数を作成する必要がある場合に役立ちます (ポインターを実際に使用するには、最後にのみ、適切な型へのキャストが必要です)。また、へのキャスト
(void)
は、値を意図的に未使用としてマークするためによく使用され、コンパイラの警告を抑制します。int somefunction(int a, int b, int c) { (void)c; // c is reserved for future usage, kill the "unused parameter" warning return a+b; }
この質問は、言語の歴史と関係があります。C++ は C から借用され、C は型指定されていないものすべてを as として暗黙的に型指定していましたint
(結局のところ、それは恐ろしい考えでした)。これには、プロシージャーとして意図された関数が含まれていました (関数とプロシージャーの違いは、プロシージャー呼び出しがステートメントであるのに対し、関数呼び出しは式であることを思い出してください)。初期の C の本を読んで正しく思い出すと、プログラマーはこの欠点に#define
次のパッチを適用していました。
#define void int
この規則は後に C 標準で採用され、void
プロシージャとして意図された関数を示すためにキーワードが導入されました。これは非常に役に立ちました。コードが何も返すことを意図していない関数からの戻り値を使用しているかどうかをコンパイラがチェックできるようになったためです。
C、C++、Java などの命令型プログラミング言語では、型の関数とメソッドがvoid
副作用に使用されます。返される意味のある値は生成されませんが、考えられる多くの方法のいずれかでプログラムの状態に影響を与えます。たとえば、exit
C の関数は値を返しませんが、アプリケーションを中止するという副作用があります。別の例として、C++ クラスには、そのインスタンス変数の値を変更する void メソッドがある場合があります。
void() は何も返さないことを意味します。
void
何の意味もありません。何も表さvoid
ないタイプです。これは微妙な違いです。何も表していなくても、表現は依然として必要です。
この型 は、何も返さない関数の戻り型として使用されます。これは、 として使用される場合、一般的なデータを表すためにも使用されvoid*
ます。whileは何もvoid
表さず、すべてを表します。void*
戻り値が必要ない場合があるからです。それが私たちがそれを使用する理由です。
グローバル変数で何らかの計算を行い、結果をグローバル変数に入れる必要がある場合や、引数などに応じて何かを出力したい場合を考えてみてください。これらの状況では、値を返さないメソッドを使用できます。空所
関数の例を次に示します。
struct SVeryBigStruct
{
// a lot of data here
};
SVeryBigStruct foo()
{
SVeryBigStruct bar;
// calculate something here
return bar;
}
そして今、ここに別の関数があります:
void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar
{
bar.member1 = ...
bar.member2 = ...
}
2 番目の関数は高速で、構造体全体をコピーする必要はありません。
がなかった場合void
、関数が値を返さないことをどのようにコンパイラに伝えますか?
おそらく、コンパイラに「すべての cpu-registers をプッシュおよびポップする必要はありません!」と伝えるためです。
返品するのではなく、何かを印刷するために使用できる場合があります。例については、 http://en.wikipedia.org/wiki/Mutator_method#C_exampleを参照してください