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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
MoS/Tmpl: Webページの出典/重複する記述の除去/表の整理
2件のリンク切れを修正
7行目: 7行目:
似たものとしてnil([[Null]])や{{日本語版にない記事リンク|Unit型|en|Unit type}}があるが、(本来の)Void型はその型の値は存在しないという点が、NullやUnitと異なる。
似たものとしてnil([[Null]])や{{日本語版にない記事リンク|Unit型|en|Unit type}}があるが、(本来の)Void型はその型の値は存在しないという点が、NullやUnitと異なる。


C言語や[[C++]]では'''void型へのポインタ'''({{code|lang=c|void *}}のように書く)があるが、これは上で述べたvoid型と直接関連するものではなく、「不特定の」(任意の)型のデータを指す[[ポインタ (プログラミング)|ポインタ]]となっている。つまり、この文脈ではvoidが汎用型として扱われている。プログラムでどんな型のデータもvoid型のポインタから指すことができ、逆に元のデータを参照することもできるため、[[ポリモーフィズム|ポリモーフィック]]な関数を書く際に有用である(なお、標準規格では、関数ポインタについては扱いが違う<ref>http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html{{リンク切れ|date=2018年10月}}</ref>)。
C言語や[[C++]]では'''void型へのポインタ'''({{code|lang=c|void *}}のように書く)があるが、これは上で述べたvoid型と直接関連するものではなく、「不特定の」(任意の)型のデータを指す[[ポインタ (プログラミング)|ポインタ]]となっている。つまり、この文脈ではvoidが汎用型として扱われている。プログラムでどんな型のデータもvoid型のポインタから指すことができ、逆に元のデータを参照することもできるため、[[ポリモーフィズム|ポリモーフィック]]な関数を書く際に有用である(なお、標準規格では、関数ポインタについては扱いが違う<ref>{{Cite web |url= http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html|title= Generic Function Pointers In C And Void|accessdate=2018-10-19 |publisher= |archiveurl=https://web.archive.org/web/20100107030330/http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html |archivedate=2010-01-07 |deadlink=2018年10月}}</ref>)。


また、[[JavaScript]]など、言語によっては、'''void演算子'''が存在する。JavaScriptのvoid演算子は、オペランドの式を評価してその値を得る計算をおこなうが、その値は捨てられ、値を返さない。C言語における、値を捨てることを明示するためのvoid型へのキャスト(たとえば、{{code|lang=javascript|(void)printf("Hello");}}のように書く)に似ている。
また、[[JavaScript]]など、言語によっては、'''void演算子'''が存在する。JavaScriptのvoid演算子は、オペランドの式を評価してその値を得る計算をおこなうが、その値は捨てられ、値を返さない。C言語における、値を捨てることを明示するためのvoid型へのキャスト(たとえば、{{code|lang=javascript|(void)printf("Hello");}}のように書く)に似ている。
14行目: 14行目:
返り値がvoid型の関数では、引数なしの[[return文]]<!--を実行するか、abort、exitなどの関数を呼び出すこと--><!-- ← プログラムごと終了するのであって、関数の終了ではない -->で呼び出し元に戻る(あるいは、プログラムの終了まで戻らないか、longjmpのように別の場所に飛ぶ)。<!--C の最新規格C11では、関数が処理の終わりまで達してしまった場合の動作は未定義である。--><!-- ← _Noreturn と勘違いしてないか? -->また、[[関数プロトタイプ]]にvoidを単独で書いて、「[[引数]]がない」ことを明示する用途にも使われる。void(空虚)という名前に反して、Unit型のような使われ方をしている。(型理論的には、Unit型には () という唯一の値が存在し(Unit型の値は1個)、Void型の値は存在しない(Void型の値は0個))。
返り値がvoid型の関数では、引数なしの[[return文]]<!--を実行するか、abort、exitなどの関数を呼び出すこと--><!-- ← プログラムごと終了するのであって、関数の終了ではない -->で呼び出し元に戻る(あるいは、プログラムの終了まで戻らないか、longjmpのように別の場所に飛ぶ)。<!--C の最新規格C11では、関数が処理の終わりまで達してしまった場合の動作は未定義である。--><!-- ← _Noreturn と勘違いしてないか? -->また、[[関数プロトタイプ]]にvoidを単独で書いて、「[[引数]]がない」ことを明示する用途にも使われる。void(空虚)という名前に反して、Unit型のような使われ方をしている。(型理論的には、Unit型には () という唯一の値が存在し(Unit型の値は1個)、Void型の値は存在しない(Void型の値は0個))。


初期のC言語では、返り値が明示されていない関数が<code>int</code>型として扱われ、また引数のない関数ではただ空のカッコを書いていた。そして、指す先の型が決まらないポインタは整数、あるいは<code>char</code>へのポインタを代用していた。この仕様だった[[コンパイラ]]では、関数の返り値を使わないことで警告が出ていたので、それをvoid型に[[型変換|キャスト]]することで警告を出さないようなコードが書かれることもあった。[[ビャーネ・ストロヴストルップ]]が1979年~80年頃に[[C++]]の開発を始めた時点では、void型やそのポインタは[[AT&T]]系のコンパイラがサポートしていた[[方言 (プログラミング言語)|方言]]であった<ref>http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, "Standardisation."{{リンク切れ|date=2018年10月}}</ref>。
初期のC言語では、返り値が明示されていない関数が<code>int</code>型として扱われ、また引数のない関数ではただ空のカッコを書いていた。そして、指す先の型が決まらないポインタは整数、あるいは<code>char</code>へのポインタを代用していた。この仕様だった[[コンパイラ]]では、関数の返り値を使わないことで警告が出ていたので、それをvoid型に[[型変換|キャスト]]することで警告を出さないようなコードが書かれることもあった。[[ビャーネ・ストロヴストルップ]]が1979年~80年頃に[[C++]]の開発を始めた時点では、void型やそのポインタは[[AT&T]]系のコンパイラがサポートしていた[[方言 (プログラミング言語)|方言]]であった<ref>{{Cite web |url= http://cm.bell-labs.com/cm/cs/who/dmr/chist.html|title=The Development of the C Language |last=Dennis M|first=Ritchie|accessdate=2018-10-19 |publisher= |archiveurl= https://web.archive.org/web/20080814214554/http://cm.bell-labs.com:80/cm/cs/who/dmr/chist.html|archivedate=2008-08-14 |deadlink=2018年10月}}</ref>。


型が明示されないとint、という仕様は、C90では規格化された。
型が明示されないとint、という仕様は、C90では規格化された。

2018年10月19日 (金) 11:31時点における版

void(ボイド)は、プログラミング言語において、「何もない」といった意味の型などに使われる名前である。プリミティブとしてキーワードないし予約語であることも多い。

ALGOL68やC言語などでは、有意な値を返さないサブルーチンについて、関数としての形式上void型としている。この場合は意味的には(型理論的には)本来はUnit型英語: Unit typeである。呼び出し側に返り値を戻さない関数を書く場合に用いられる。そのような関数は、何かしらの処理、あるいは引数を出力するといった、副作用のために呼び出されるのが通例である。値を返さない手続きは関数ではなくプロシージャである、という言語(Visual BasicPascal)もある。(「返り値を戻さない」のではなく、「呼び出し側に戻らない」のであれば理論的にもvoid型と言える)

似たものとしてnil(Null)やUnit型英語: Unit typeがあるが、(本来の)Void型はその型の値は存在しないという点が、NullやUnitと異なる。

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

また、JavaScriptなど、言語によっては、void演算子が存在する。JavaScriptのvoid演算子は、オペランドの式を評価してその値を得る計算をおこなうが、その値は捨てられ、値を返さない。C言語における、値を捨てることを明示するためのvoid型へのキャスト(たとえば、(void)printf("Hello");のように書く)に似ている。

C言語、C++

返り値がvoid型の関数では、引数なしのreturn文で呼び出し元に戻る(あるいは、プログラムの終了まで戻らないか、longjmpのように別の場所に飛ぶ)。また、関数プロトタイプにvoidを単独で書いて、「引数がない」ことを明示する用途にも使われる。void(空虚)という名前に反して、Unit型のような使われ方をしている。(型理論的には、Unit型には () という唯一の値が存在し(Unit型の値は1個)、Void型の値は存在しない(Void型の値は0個))。

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

型が明示されないとint、という仕様は、C90では規格化された。

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

CC++備考
void f(void);void f();C++ではこの記法が推奨されている
void f(void);void f(void);
void f();void f(……);可変長引数

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

ECMAScript

ECMAScriptでは、voidはキーワードであり(予約語を参照)、単項式の前に付けて単項式を形成する前置演算子のひとつである[5]。構文規則上はvoid 単項式という形のためvoid()という形で用いられることが多い。式を評価し、その値を取得するがその値を特にどうともせず、常に「undefined」を返す。もっぱらHTML内で、<a href="javascript:void(0)">foo</a>のように記述して、リンクとしての機能を働かせないために用いられる。

脚注

  1. ^ Generic Function Pointers In C And Void”. 2010年1月7日時点のオリジナルよりアーカイブ。2018年10月19日閲覧。
  2. ^ Dennis M, Ritchie. “The Development of the C Language”. 2008年8月14日時点のオリジナルよりアーカイブ。2018年10月19日閲覧。
  3. ^ Stroustrup, Bjarne (2009). Programming: Principles and Practice Using C++. Boston: Addison-Wesley. p. 996. ISBN 0321543726 
  4. ^ C and C++: Case Studies in Compatibility”. Dr. Dobb's. UBM (2002年9月1日). 2018年10月18日閲覧。
  5. ^ 12.5.4 The void Operator”. ECMAScript® 2019 Language Specification. Ecma International (2018年). 2018年10月18日閲覧。