[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
2022-03-23 14:25:48
質問
#include <stdio.h>
int main(void)
{
int i = 0;
i = i++ + ++i;
printf("%d\n", i); // 3
i = 1;
i = (i++);
printf("%d\n", i); // 2 Should be 1, no ?
volatile int u = 0;
u = u++ + ++u;
printf("%d\n", u); // 1
u = 1;
u = (u++);
printf("%d\n", u); // 2 Should also be one, no ?
register int v = 0;
v = v++ + ++v;
printf("%d\n", v); // 3 (Should be the same as u ?)
int w = 0;
printf("%d %d\n", ++w, w); // shouldn't this print 1 1
int x[2] = { 5, 8 }, y = 0;
x[y] = y ++;
printf("%d %d\n", x[0], x[1]); // shouldn't this print 0 8? or 5 0?
}
解決方法は?
C言語には未定義動作という概念があります。つまり、ある言語構成は構文的には有効ですが、コードを実行したときの動作を予測することはできません。
私の知る限り、この規格では明示的に なぜ 未定義の動作という概念は存在します。私の考えでは、言語設計者がセマンティクスに余裕を持たせたかっただけで、すべての実装がまったく同じ方法で整数のオーバーフローを処理することを要求するのではなく、その代わりに、もし整数のオーバーフローを引き起こすコードを書けば何でも起こりうるように、動作を未定義にしたのだと思います。
では、それを踏まえた上で、なぜこれらの"issue"なのでしょうか?この言語では、あることが原因で
未定義の動作
. 問題はなく、"should" は関係ありません。もし、関係する変数の1つが宣言されたときに、未定義の動作が変化するなら、それは
volatile
しかし、それは何の証明にも変化にもなりません。それは
未定義
その挙動を推論することはできません。
あなたの最も面白そうな例、それは
u = (u++);
は、未定義の動作の教科書的な例です (Wikipedia の シーケンスポイント ).
関連
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】strcmpが機能しない
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 未定義の動作とシーケンスポイント
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
-
[解決済み] 未定義、未指定、および実装で定義された動作
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】警告:式の結果が未使用の場合