16

これはc99標準で見つかりました

3.17.2
1 indeterminate value
either an unspecified value or a trap representation

この上記のステートメントは、私には明確ではありません。これが何であり、その長所と短所は何ですか?

いくつかの例は高く評価されます。

4

2 に答える 2

15

この 2 つ (不定値とトラップ表現) の区別は基本です。場合によっては、既知の値がありません。もう一方には、既知の無効な値があります。

私が集めることができる不確定な値の最も簡単な例:

int a;
int b = a;

に関連付けられた確定的な「値」の概念はありませんa。それは(メモリを占有しているため)何かを持っていますが、それが持っている「何」は定義されていないため、不確定です。全体として、概念は見た目と同じくらい単純です。何かが決定されていない限り、決定論的な結果を伴う評価 (役立つ場合は r 値を考えてください) に使用することはできません。

実際の値は、言語、コンパイラ、およびメモリ管理ポリシーによって異なります。たとえば、C のほとんどの実装では、初期化されていないスコープ変数または malloc の呼び出しによって返されるポインターが指すメモリには、以前にそのアドレスに格納されていた値が含まれます。一方、ほとんどのスクリプト言語は、変数を何らかのデフォルト値 (0、"" など) に初期化します。

トラップ表現に関しては、基本的に、基礎となる正式な定義に関連する許容値の制限されたドメインの外側にある値です。うまくいけば、紛らわしくない例が続きます。:

enum FooBar { foo=0, bar=1 };
enum FooBar fb = (enum FooBar)2;

一般に、基礎となるストレージ表現によって許可されたスペース内に収まる任意のビット パターン ( である可能性が高い列挙型int) ですが、正式な定義の制限されたドメインの有効な「値」とは見なされません。トラップ表現とそのルーツに関する優れた説明は、この回答にあります。上記は、非常に単純な既知の無効な表現がどのように見えるかの単なる代表例です。実際には、無効状態をトリガーする値を検出するためにハードウェアで実践されています。私はそれらを「パニック」値と考えています。繰り返しますが、上記のコードは、「有効」ではなく、実際には知られている「値」の概念を実証するという点で、単に理想主義的です。

于 2012-11-16T20:11:16.013 に答える
5

特に指定しない限り、静的オブジェクトには、プログラムの起動時にゼロまたはヌル ポインター値が含まれます。自動および動的に割り当てられたオブジェクトは、初期値が明示的に指定されている場合にのみ初期化されます。それ以外の場合、最初は不確定な値になります (通常、たまたまストレージに存在するビット パターンは、その型の有効な値を表していない可能性があります)。

参考:ウィキペディア

于 2012-11-16T20:09:05.910 に答える