コンテンツにスキップ
Wikipedia

Undefined値

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Yuki-cy (会話 | 投稿記録) による 2022年10月20日 (木) 03:18 (個人設定で未設定ならUTC)時点の版 (修正)であり、現在の版 とは大きく異なる場合があります。

Yuki-cy (会話 | 投稿記録)による2022年10月20日 (木) 03:18時点の版 (修正)

Undefined(アンディファインド)とは、プログラミングにおいてに正しいがない状態である。空の文字列ブール値の「false」、またはその他の「空の」値とは異なる。状況によっては、未定義の値を評価すると例外または未定義の動作が発生する場合があるが、一部のプログラミング言語では、プログラムの通常の予測可能な実行中に未定義の値が発生する可能性がある。

動的型付けされた言語は通常、可能な場合は未定義の値を明示的に扱う。たとえば、 Perlにはそのような値を変数に「割り当てる」ことができるundef演算子が存在する。他の型システムでは、未定義の値はプログラムの失敗を意味する可能性がある。 null許容型は中間的なアプローチを提供する。

取り扱い

例えば、配列の範囲外アクセスすることで発生する。このような状況を実際に処理するには、さまざまな方法がある。

予約値

未定義の値を適切に処理する必要があるアプリケーションでは、通常の値と区別できる特別なnull値を予約するのが一般的である。これは、以前は未定義のケースを表す定義済みの値を作成することにより、問題を解決する。

動的に型付けされた言語では、初期化されていない変数がデフォルトでnullになることがあるが、静的に型付けされた値では明確に定義されたnullと初期化されていない値を区別する[1]

例外処理

一部のプログラミング言語には、値を返さない場合に対処するための例外処理の概念がある。関数は定義された方法で実行されるが、値を返さないため、返すために特別な値を考案する必要がなくなる。

この例に信号処理がある。これはオペレーティングシステムレベルで実行され、プログラミング言語には統合されていない。シグナルハンドラは、計算の一部を終了するなど、いくつかの形式の回復を試みることができるが、完全に統合された例外処理ほどの柔軟性はない。

戻り値のない関数

戻り値の設定されていない関数はundefinedを返す。このような関数には、値のないボトム型が正式に割り当てられている。例は大きく2種類存在する。

  • 無限ループする関数。これは、故意に、または決して見つからないものを検索した結果として発生する可能性がある。
  • <code id="mwZg">exit</code>システムコールなど、計算を終了する関数。プログラム内からは、これは前のケースと区別できないが、プログラムの呼び出し元に違いが生る。

Undefinedの動作

未定義の値を処理するには、未定義を検出する必要がある。つまり、呼び出された関数が、通常の結果を返すことができないと判断し、呼び出し元に通知するためのアクションを実行する。スペクトルのもう一方の端では、未定義の動作により、呼び出し元に責任が課せられ、ドメイン外の引数を使用して関数を呼び出さないようにする。原因は簡単に検出できるクラッシュや、最悪の場合、一見無関係な計算での微妙なエラーである。

また、未定義の値は、ハードウェアで特に頻繁に発生する。ワイヤが有用な情報を伝達していない場合でも、ワイヤは存在し、ある程度の電圧レベルがある。

データバッファが提供されているが完全に満たされていない場合、ソフトウェアでも同じ状況が発生する。たとえば、Cライブラリのstrftime関数は、タイムスタンプを提供された出力バッファで人間が読める形式に変換するが、出力バッファが結果を保持するのに十分な大きさでない場合、エラーが返され、バッファの内容はUndefinedになる。

逆に、 POSIXの<code id="mwhA">open</code>システムコールは、ファイル名、いくつかのフラグ、およびファイルモードの3つの引数を取り、ファイルモードは、フラグにO_CREATが含まれている場合にのみ使用される。 O_CREATが省略されている場合、ファイルモードにUndefinedの値を与えるopenの2つの引数形式を使用するのが一般的である。

このようなUndefinedを制限された方法で処理すると便利な場合がある。未定義の値が後で無視された場合でも、全体的な計算は明確に定義できる。

この例として、C言語では、ポインターを整数に変換できるが、その整数の数値は未定義である。それでも、デバッグ、2つのポインターの同等性の比較、またはXORリンクリストの作成に役立つ場合がある。

未定義の値を安全に処理することは、事後に競合状態を検出する楽観的同時実行制御システムで重要になる。たとえば、 seqlockで保護されている共有変数を読み取ると、競合状態が発生したと判断する前に未定義の値が生成される。その後、未定義のデータを破棄し、操作を再試行する。これにより、未定義の値に対して実行された操作が本格的な未定義の動作を生成しない限り、定義された結果が生成される。

表記

計算可能性理論では、式の未定義はexpr ↑で表され、定義はexpr ↓で表される。

関連項目

参考文献

  1. ^ "C# Nullable Numeric Data Types". C# Fundamentals tutorial (2006年10月1日). 2010年3月27日閲覧。

AltStyle によって変換されたページ (->オリジナル) /