[解決済み] (なぜ)初期化されていない変数を使用することは未定義の動作なのですか?
質問
もし、私が
unsigned int x;
x -= x;
というのは明らかです。
x
べき
がゼロになるはずなのですが、どこを見ても、この式の後に
の動作は
の値だけでなく、このコードの挙動は未定義であると言っています。
x
(の値だけではありません(減算の前まで)。
2つの質問です。
-
は 動作 は本当に未定義なのでしょうか?
(例:準拠したシステムでコードがクラッシュ[または悪化]するかもしれませんか?) -
もしそうなら なぜ は、Cが 動作 が未定義であることは明らかであるのに
x
はゼロであるべきであることは明らかなのに?すなわち 利点 ここで動作を定義しないことによって与えられる利点は何でしょうか?
明らかに、コンパイラは単に を使用することができます。 を使用することができ、それは意図したとおりに動作するでしょう...そのアプローチの何が問題なのでしょうか?
どのように解決するのですか?
はい、この動作は未定義ですが、多くの人が認識しているのとは異なる理由によるものです。
最初に、ユニット化された値を使用すること自体は未定義の動作ではありませんが、値は単に不確定です。値がたまたま型のためのトラップ表現である場合、これにアクセスすることは UB です。符号なし型はめったにトラップ表現を持たないので、その面では比較的安全でしょう。
動作を未定義にするのは、変数の追加プロパティ、すなわち、それが "で宣言されている可能性があることです。
register
で宣言された可能性があること、つまりそのアドレスは決して取得されないということです。このような変数が特別に扱われるのは、"uninitialized" で、型領域内の値に対応しない一種の余分な状態を持つ、実際の CPU レジスタを持つアーキテクチャがあるためです。
編集してください。 規格の該当文言は6.3.2.1p2です。
lvalueが自動保存期間のオブジェクトを指定する場合,それは レジスタ記憶クラスで宣言されたかもしれない(アドレスが取られたことがない)自動記憶期間のオブジェクトを指定する場合 そのアドレスが取得されたことがない)、そのオブジェクトが初期化されていない(イニシャライザで宣言されていない)。 初期化されておらず,使用前に代入が行われていない)場合,動作は未定義となる。 への代入が行われていない)、動作は未定義です。
また、より明確にするために、以下のコードでは は はどのような状況でも合法です。
unsigned char a, b;
memcpy(&a, &b, 1);
a -= a;
-
ここでは
a
とb
が取られるため、その値は単に 不定です。 -
から
unsigned char
は決してトラップ表現を持っていません。 不定値は単なる不定値なのでunsigned char
のどのような値でも が起こり得ます。 -
最後に
a
は 値を保持する0
.
編集2
a
そして
b
は値が指定されていません。
3.19.3 不特定値
この国際規格がどの値を選ぶかについて要求していない場合、関連する型の有効な値。 を選択することはできません。
関連
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] JavaScriptで変数が存在するか(定義されているか/初期化されているか)をチェックする
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 未定義の動作とシーケンスポイント
-
[解決済み] 未定義、未指定、および実装で定義された動作
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] C++の規格では、初期化されていないboolがプログラムをクラッシュさせることは可能ですか?
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み】f(i = -1, i = -1)の挙動が未定義なのはなぜ?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?