「Void (コンピュータ)」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
en:void type 09:29, 15 December 2011‎ (UTC) の翻訳を元に再構成+演算子について加筆
 
m lk修正
4行目: 4行目:
[[ALGOL]]や、[[C言語]]とそこから派生した言語には、'''void型'''と呼ばれる[[データ型|型]]があり、呼び出し側に返り値を戻さない[[サブルーチン|関数]]を書く場合に用いられる。そのような関数は、何かしらの処理、あるいは引数を出力するといった、[[副作用 (プログラム)|副作用]]のために呼び出されるのが通例である。「値を返さない処理」を作成するために、void型を使うのではなく、別な命令により書く言語([[Visual Basic]]や[[Pascal]])もある。[[関数型言語]]で用いられる{{日本語版にない記事リンク|Unit型|en|Unit type}}とも似ているが、void型の値は存在しないという意味合いで使える用途に違いもある。
[[ALGOL]]や、[[C言語]]とそこから派生した言語には、'''void型'''と呼ばれる[[データ型|型]]があり、呼び出し側に返り値を戻さない[[サブルーチン|関数]]を書く場合に用いられる。そのような関数は、何かしらの処理、あるいは引数を出力するといった、[[副作用 (プログラム)|副作用]]のために呼び出されるのが通例である。「値を返さない処理」を作成するために、void型を使うのではなく、別な命令により書く言語([[Visual Basic]]や[[Pascal]])もある。[[関数型言語]]で用いられる{{日本語版にない記事リンク|Unit型|en|Unit type}}とも似ているが、void型の値は存在しないという意味合いで使える用途に違いもある。


C言語や[[C++]]では'''void型へのポインタ'''(<code>void *</code>として宣言される)があるが、これは上で述べたvoid型と直接関連するものではなく、「void型へのポインタ」は、「不特定の」型を指す[[ポインタ (プログラミング)]]となっている。つまり、この文脈ではvoidが汎用型として扱われている。プログラムでどんな型のデータもvoid型のポインタから指すことができ、逆に元のデータを参照することもできるため、[[ポリモーフィズム|ポリモーフィック]]な関数を書く際に有用である(ただし、関数はデータとして扱えないため、関数ポインタについては違ってくる部分がある<ref>http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html</ref>)。
C言語や[[C++]]では'''void型へのポインタ'''(<code>void *</code>として宣言される)があるが、これは上で述べたvoid型と直接関連するものではなく、「void型へのポインタ」は、「不特定の」型を指す[[ポインタ (プログラミング)|ポインタ]]となっている。つまり、この文脈ではvoidが汎用型として扱われている。プログラムでどんな型のデータもvoid型のポインタから指すことができ、逆に元のデータを参照することもできるため、[[ポリモーフィズム|ポリモーフィック]]な関数を書く際に有用である(ただし、関数はデータとして扱えないため、関数ポインタについては違ってくる部分がある<ref>http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html</ref>)。


また、[[JavaScript]]など、言語によっては、'''void演算子'''が存在する。void演算では、オペランドは評価されるものの、値は返さない。
また、[[JavaScript]]など、言語によっては、'''void演算子'''が存在する。void演算では、オペランドは評価されるものの、値は返さない。

2011年12月19日 (月) 09:12時点における版

void(ボイド)は、プログラミング言語において、「何もないこと」を意味する識別子である。

ALGOLや、C言語とそこから派生した言語には、void型と呼ばれるがあり、呼び出し側に返り値を戻さない関数を書く場合に用いられる。そのような関数は、何かしらの処理、あるいは引数を出力するといった、副作用のために呼び出されるのが通例である。「値を返さない処理」を作成するために、void型を使うのではなく、別な命令により書く言語(Visual BasicPascal)もある。関数型言語で用いられるUnit型英語: Unit typeとも似ているが、void型の値は存在しないという意味合いで使える用途に違いもある。

C言語やC++ではvoid型へのポインタvoid *として宣言される)があるが、これは上で述べたvoid型と直接関連するものではなく、「void型へのポインタ」は、「不特定の」型を指すポインタとなっている。つまり、この文脈ではvoidが汎用型として扱われている。プログラムでどんな型のデータもvoid型のポインタから指すことができ、逆に元のデータを参照することもできるため、ポリモーフィックな関数を書く際に有用である(ただし、関数はデータとして扱えないため、関数ポインタについては違ってくる部分がある[1])。

また、JavaScriptなど、言語によっては、void演算子が存在する。void演算では、オペランドは評価されるものの、値は返さない。

C言語、C++

返り値がvoid型の関数では、関数は処理が終わりまで達するか、引数なしでreturn文を実行することで終了する。また、関数プロトタイプにvoidを単独で書いて、「引数がない」ことを明示する用途にも使われる。void(空虚)という名前に反して、void型は空集合を意図したunit型のような使われ方をしている。ただし、void型の値を実際に作り出す方法は言語上に存在しない。

初期のC言語では、返り値が明示されていない関数がint型として扱われ、また引数のない関数ではただ空のカッコを書いていた。そして、指す先の型が決まらないポインタは整数、あるいはcharへのポインタを代用していた。この仕様だったコンパイラでは、関数の返り値を使わないことで警告が出ていたので、それをvoid型にキャストすることで警告を出さないようなコードが書かれることもあった。ビャーネ・ストロヴストルップが1979年~80年頃にC++の開発を始めた時点では、void型やそのポインタはAT&T系のコンパイラがサポートしていた方言であった[2]

関数プロトタイプでvoidを明示することと、何も書かないのとでは、以下のようにC言語とC++で意味合いに違いが出てくる[3]

C++ C言語
void f(); //推奨されている書き方 void f(void);
void f(void); void f(void);
void f(...); //可変長引数 void f(); /* 可変長引数 */

ただしC言語でも、C99では上記のvoid f()のような、何も書かないことで可変長の引数を意味する記法が非推奨となっている[4]

void演算子

voidという演算子があるプログラミング言語もあり、JavaScriptでは、void(式)あるいはvoid 式という形で用いられる。どちらも式は評価されるがその値は使われず、void演算子は常にundefinedを返す[5]。HTML内で、<a href="javascript:void(0)">ほげほげ</a>のように記載して、リンクとしての機能を働かせないために用いることもある。

脚注

  1. ^ http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html
  2. ^ http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, "Standardisation."
  3. ^ Stroustrup, Bjarne (2009). Programming: Principles and Practice Using C++. Boston: Addison-Wesley. p. 996. ISBN 0321543726 
  4. ^ Bjarne Stroustrup, C and C++: Case Studies in Compatibility. Reconcilable differences? You decide, Dr. Dobb's, September 01, 2002; print version
  5. ^ void 演算子”. マイクロソフト. 2011年12月19日閲覧。