11

質問に対する回答のコメントで質問が発生しました。intに型キャストされた場合、C / C ++ブール型は常に0または1であることが保証されていますか?

問題のコードは、値を初期化せずにの(ローカル)配列を割り当てboolます。

const int n = 100;
bool b[n];

明らかに、の値bは不確定です。

一部のコメント提供者は、例えば読書b[0]は未定義の行動であると意見を述べました。これはC++標準のどこかに記載されていますか?私はまだ反対のことを確信しています:

  1. コンストラクターがないため、明らかにストレージが割り当てられ、基本的なブール型の初期化が完了しています。したがって、初期化されていないポインタを逆参照したり、初期化されていない重要なオブジェクトに対してメソッド/キャスト演算子を呼び出したりすることとは確かに同じではありません。これらの特定のケースは、標準でカバーされているようです。

  2. 動作は実際にCでは定義されていません。Cで宣言された初期化されていない変数はどうなりますか?価値はありますか?一部の回答者は2つを混同しているようです。

  3. 最新のC++0xドラフトでは、不確定な値の定義、特にそのような値にアクセスしてプロセッサトラップをトリガーできる定義は見つかりません。確かに、Bjarne Stroustrupは、不確定な値が何であるかを確信していません:http: //zamanbakshifirst.blogspot.com/2007/02/c-indeterminate-value.html

4

4 に答える 4

6

はい、形式的には、不定値の右辺値変換は UB です (ただしunsigned char、最初は「およびバリアント」と書きましたが、形式的に 1 の補数の符号付き文字を思い出すと、マイナス 0 がトラップ値として使用される可能性があります)

私はあなたのために標準的な段落検索を行うのが面倒だし、そのための反対票を気にするのも面倒です

ただし、実際には、(1) 古風なアーキテクチャ、およびおそらく (2) 64 ビット システムの問題のみです。

編集: おっと、不確定な文字にアクセスするための正式な UB に関するブログ投稿と関連する欠陥レポートを思い出したようです。したがって、おそらく標準の検索 DR を実際に確認する必要があります。うーん、それは後でする必要があります。今はコーヒーです!

EDIT2 :Johannes Schaubは、charにアクセスするためのUBが議論されたSOの質問へのこのリンクを提供するのに十分親切でした。というわけで、ここから覚えました!ありがとう、ヨハネス。

乾杯 & hth.,

于 2010-11-25T16:54:10.190 に答える
5
于 2010-11-25T18:22:45.287 に答える
1

不確定な値を読み取ると一般に未定義の動作が発生するという事実は、単に「理論上の」問題ではありません。考えられるすべてのビット パターンに値が定義されている型の場合でも、不確定な値が Unspecified 値とは異なる方法で動作することを「驚くべき」と見なすべきではありません。たとえば、*p が不定値を保持し、x が示されている以外の場所で使用されていない場合、コードは次のようになります。

uint32_t x,y,z;
...
x = *p;
if (condition1) y=x;
... code that "shouldn't" affect *p if its value is defined
if (condition2) z=x;

次のように書き換えることができます。

if (condition1) y=*p;
... code that "shouldn't" affect *p if its value is defined
if (condition2) z=*p;

*p の値が Indeterminate の場合、コンパイラは 2 つの「if」ステートメントの間のコードでその値を変更することを禁止されません。たとえば、*p によって占有されていたストレージが解放されて再 malloc される前に「float」によって占有されていた場合、コンパイラは上記の 2 つの「if」ステートメントの間にその「float」値を書き込む可能性があります。

于 2016-05-07T16:17:10.113 に答える