「C言語/制御文」の版間の差分
削除された内容 追加された内容
{{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }} タグ: 2017年版ソースエディター |
→分岐文: cleanup タグ: 2017年版ソースエディター |
||
725 行
== 分岐文 ==
分岐文( jump statements )は、無条件に別の場所にジャンプします<ref name="jtc1-sc22-wg14-n2596-6.8.6">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
| page=126, §6.8.6 ''The jump statements''
| publisher = [http://www.open-std.org/jtc1/sc22/wg14/www/projects ISO/IEC JTC1/SC22/WG14]}}</ref>。
構文
jump-statement:
[[#goto文|goto]] identifier ;
[[#continue文|continue]] ;
[[#break文|break]] ;
[[#return文|return]] expression<sub>opt</sub> ;
=== goto文 ===
goto文( goto statement )は、包含する関数内の、名前の付いたラベルを先頭に持つ文に無条件にジャンプします<ref name="jtc1-sc22-wg14-n2596-6.8.6.1">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| 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"/>
;goto文の形式:<syntaxhighlight lang="C">
goto 識別子 ;
</syntaxhighlight>
;ラベル文の形式:<syntaxhighlight lang="C">
識別子 :
</syntaxhighlight>
;[https://paiza.io/projects/KhbOJ-86RYOk0V_up6nyjQ?language=c 例]:<syntaxhighlight lang="C">
#include <stdio.h>
int main(void) {
int x, y;
for (x = 1; x <= 9; ++x) {
if (y * x >= 50)
goto exit_loop;
}
}
exit_loop:
printf("九九の表で、最初に50以上になるのは%d×%d。\n", y, x);
}
</syntaxhighlight>
{{コラム|goto文の使用は一般的に推奨されせん。|
goto文の使用は一般的に推奨されません。
その理由は、コードの構造が把握しにくくなるからです(スパゲッティコード)。
また、入れ子になった複数のスイッチやループから逃れるために(大域脱出)、goto文が使われることがありますが、大域脱出は、ループを関数にしてreturn文で脱出したり、setjmpとlongjmpを使うなど、他の方法でも実現できます。
}}
===
continue文( ''continue statement'' )は、それを囲む最小の反復文のループ継続部分、すなわち、ループ本体の終わりにジャンプする<ref name="jtc1-sc22-wg14-n2596-6.8.6.2">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
| page=126, §6.8.6.2 ''The continue statement''
| publisher = [http://www.open-std.org/jtc1/sc22/wg14/www/projects ISO/IEC JTC1/SC22/WG14]}}</ref><ref>『JISX3010:2003』p.104「6.8.6.2 continue文」</ref>。
; 制約事項
: continue文は、ループ本体の中にのみ現れることが許されます。
;コード例
:{|
|<syntaxhighlight lang="C">
while (/* ... */) {
/* ... */
continue;
/* ... */
contin:
}
</syntaxhighlight>
|<syntaxhighlight lang="C">
do {
/* ... */
continue;
/* ... */
contin:;
} while (/* ... */);
</syntaxhighlight>
|<syntaxhighlight lang="C">
for (/* ... */) {
/* ... */
continue;
/* ... */
contin:
}
</syntaxhighlight>
|}
:上のコード例での continue は、goto continと同等です<ref>2番目の例のcontin:ラベルに続くのは、NULL文です。1つ目と3つ目の例のnull文は、ラベルによって暗示されてます。</ref>。
;形式:<syntaxhighlight lang="C">
continue;
</syntaxhighlight>
;[https://paiza.io/projects/IM89XiUvAXhyRY6_KHv7hA?language=c continue文の使用例]:
<syntaxhighlight lang="C">
#include <stdio.h>
int main(void) {
// 1から14までの整数の中で、3の倍数以外を表示する。
for (int i = 1; i <= 14; i++) {
if (i % 3 == 0) {
continue;
845 ⟶ 830行目:
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang="text">
1
2
858 ⟶ 841行目:
13
14
</syntaxhighlight>
上の実行結果では、3の倍数の「3」と「6」と「9」と「12」が抜けています。
864 ⟶ 847行目:
このように、continue 文は、そのループ内の以降の処理をスキップしつつも、カウントを1回ぶん、進めます。
=== break文 ===
break文( break statement)は、最小のswitch文または反復文を囲むものの実行を終了させます<ref name="jtc1-sc22-wg14-n2596-6.8.6.3">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
| page=127, §6.8.6.3 ''The break statement''
| publisher = [http://www.open-std.org/jtc1/sc22/wg14/www/projects ISO/IEC JTC1/SC22/WG14]}}</ref><ref>『JISX3010:2003』p.105「6.8.6.3 break文」</ref>。
break文は、switch本体またはloop本体の中以外に現れてはいけません。
break文の記述は次のようになっている。
;形式:<syntaxhighlight lang="C">
break;
</syntaxhighlight>
;例:<syntaxhighlight lang="C">
#include <stdio.h>
#include <math.h>
int main(void) {
while (1) {
double d;
printf("正の数を入力してください。(0以下で終了):");
scanf("%lf", &d);
if (d <= 0)
break;
printf("%fの平方根は%f。\n", d, sqrt(d));
}
}
</syntaxhighlight>
=== for文の中のif文のbreak ===
<!--[[File:Destination Break Programming in If sentence in For sentence.svg|thumb|600px|break文の移動先の説明図]]-->
<syntaxhighlight lang="C" highlight="5,9" line>
for (・・・) {
for (・・・) {
for (・・・) {
if (・・・) {
break;
}
/* ・・・ */
}
break_point:
}
}
</syntaxhighlight>
kこのように、for文の中にif文があり、if文のブロックの中にbreak;がある場合、一番内側のfor文の終わりに処理が移ります(ここでは、ラベル break_point の位置)。
for文が2つ以上ある場合、break文で複数のfor文を一度に抜け出すことは'''不可能'''です。
=== return文 ===
return文( ''return statement'' )は、現在の関数の実行を終了し、呼び出し元に制御を返します<ref name="jtc1-sc22-wg14-n2596-6.8.6.4">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
| page=127, §6.8.6.4 ''The return 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.4 return文」</ref>。
関数はいくつでもreturn文を持つことができます<ref name="jtc1-sc22-wg14-n2596-6.8.6.4"/>。
式を持つreturn文が実行されると、その式の値が関数呼び出し式の値として呼び出し元に返されます。式の型がその関数の戻り値の型と異なる場合、その値は関数の戻り値の型を持つオブジェクトに代入されたように変換されます<ref name="jtc1-sc22-wg14-n2596-6.8.6.4"/>。
式を持つreturn文は、戻り値の型がvoidである関数の中に現れてはなりません。式を伴わないreturn文は、戻り値の型がvoidである関数の中でのみ現れます<ref name="jtc1-sc22-wg14-n2596-6.8.6.4"/>。
;形式:<syntaxhighlight lang="C">
return 式;
</syntaxhighlight>
;[https://paiza.io/projects/-WEWEhXg14BxtL3A9tMsiA?language=c 例]:<syntaxhighlight lang="C">
#include <stdio.h>
//整数1234を返す関数function
int function() { return 1234; }
int main(void) {
int i = function(); //関数functionを呼び、返却値をiに代入する。
printf("iの値は%d。", i);
}
</syntaxhighlight>
|