[解決済み] "break; "を "if "文から外す?
質問内容
if文から抜け出せるか、クラッシュの原因にならないか?C言語を知り始めているのですが、これには賛否両論あるようです。最初の画像はC言語の本からです ("Head First C")、スニペットはハーバードのCSクラスのスタッフによって書かれたコードを示しています。実際どうなのか、C言語の標準と何か関係があるのでしょうか?
<ブロッククオートは、if文を壊さない。
1990年1月15日、AT&Tの長距離電話システムがクラッシュし、6万人が電話を使えなくなった。 原因は?交換機で使われているC言語のコードを作っていた開発者が
break
から抜け出すために
if
ステートメントを使用します。 しかし
break
から抜け出さない。
if
s. その代わりに プログラムはコードの一部分を飛ばし 9時間にわたって 7000万件の電話を中断させる バグを発生させました。
for (size = 0; size < HAY_MAX; size++)
{
// wait for hay until EOF
printf("\nhaystack[%d] = ", size);
int straw = GetInt();
if (straw == INT_MAX)
break;
// add hay to stack
haystack[size] = straw;
}
printf("\n");
解決方法は?
break
は、最も近い場所にあるループやスイッチとのみ相互作用するため、それが
for
,
while
または
do .. while
という型があります。C言語のすべてのループは、実際には条件付きゴトのセットに変換することができるため、これはしばしば偽装ゴトと呼ばれます。
for (A; B; C) D;
// translates to
A;
goto test;
loop: D;
iter: C;
test: if (B) goto loop;
end:
while (B) D; // Simply doesn't have A or C
do { D; } while (B); // Omits initial goto test
continue; // goto iter;
break; // goto end;
その差は
continue
と
break
は、コンパイラが自動的に配置する仮想ラベルと相互作用します。これは
return
は、プログラムの流れの中で常に先にジャンプすることが分かっているためです。スイッチは、ラベルの配列と計算されたゴトを生成し、少し複雑ですが、breakの動作は似ています。
この通知で指摘されているプログラミングの間違いは、次のような誤解です。
break
は、ループを囲むのではなく、囲むブロックと相互作用していると考えてください。考えてみてください。
for (A; B; C) {
D;
if (E) {
F;
if (G) break; // Incorrectly assumed to break if(E), breaks for()
H;
}
I;
}
J;
このようなコードの断片が与えられたとき、誰かがこう考えた。
G
へのジャンプを引き起こします。
I
にジャンプしますが
J
. 意図した関数では
if (!G) H;
の代わりに
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み】Switch文:defaultは最後のケースでなければならない?
-
[解決済み] switch文はなぜブレークが必要な設計になっているのでしょうか?
最新
-
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 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] do { ... } while (0) - 何のために良いですか?[重複]する