「C言語/制御文」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎goto文: フローチャートからプログラムをコーディングしようとするとフロー線はgoto文そのものであるため、while文・switch文やfor文に落ちないことがあります。
タグ: 2017年版ソースエディター
722 行
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
| page=126, §6.8.6.1 ''The goto statement''
| publisher = [http://www.open-std.org/jtc1/sc22/wg14/www/projects ISO/IEC JTC1/SC22/WG14]}}</ref><ref>『JISX3010:2003』p.103「6.8.6.1 goto文」</ref>。
goto文の識別子は、包含する関数のどこかにあるラベルを指し示さなければなりません<ref name="jtc1-sc22-wg14-n2596-6.8.6.1"/>。
goto文は、可変的に変更された型を持つ識別子のスコープ外から、その識別子のスコープ内にジャンプしてはなりません<ref name="jtc1-sc22-wg14-n2596-6.8.6.1"/>
749 行
 
{{コラム|goto文の使用は一般的に推奨されせん。|
コードの構造の把握が困難なるなどの理由で、goto文の使用は一般的に推奨されません。
goto文を使用する主な理由としては、入れ子になった複数のスイッチやループから抜けるため(大域脱出)があります。
その理由は、コードの構造が把握しにくくなるからです(スパゲッティコード)。
また、入れ子になった複数のスイッチやループから逃れるために(大域脱出)、goto文が使われることがありますが、大域脱出は、ループを関数にしてreturn文で脱出したり、setjmpとlongjmpを使うなど、他の方法でも実現できます。
また、フローチャートからプログラムをコーディングしようとするとフロー線はgoto文そのものであるため、while文・switch文やfor文に落ちないことがあります。
その様な時は、フローチャートにプログラムを無理に合わせるのではなく、ロジックを構造構文で置換えてフローチャートを直すことも考慮すべきです<ref>フローチャートの「構造化されていない」ことによる欠点を補うため、いくつかの構造化チャート(Structure chart)が考案されましたが、
* チャートを書くよりも構造化されたプログラミング言語で書くほうが速い
* データの通用範囲(スコープ)をうまくチャートに表せない
* 抽象度が低い
などの理由で普及には至りませんでした。</ref>。
 
上の例であれば、
;return文を使いgoto文をなくした例:<syntaxhighlight lang="C">
#include <stdio.h>
 
int main(void) {
for (int y = 1; y <= 9; ++y) {
for (int x = 1; x <= 9; ++x) {
if (y * x >= 50) {
printf("九九の表で、最初に50以上になるのは%d×%d。\n", y, x);
return 0;
}
}
}
}
</syntaxhighlight>
のように置換え可能です。
}}