C Language
ジャンプ文
サーチ…
構文
- 戻り値。 / *現在の関数から返ります。 valは、関数の戻り値の型に変換される任意の型の値にすることができます。 * /
- 戻る; / *現在のvoid関数から返ります。 * /
- ブレーク; / *反復ステートメント(ループ)の終わりを超えて無条件に飛び越したり、最も内側のswitch文から飛び越したりします。 * /
- 持続する; / *反復ステートメント(ループ)の先頭に無条件にジャンプします。 * /
- LBLに行く。 / *ラベルLBLにジャンプします。 * /
- LBL: statement / *同じ関数内の任意のステートメント。 * /
備考
これらはキーワードでCに統合されたジャンプです。
Cには、データ型、 jmp_buf
、およびCライブラリ呼び出しsetjmp
とlongjmp
指定された別のジャンプ構造long jumpがあります。
も参照してください
gotoを使用して入れ子になったループから飛び出す
入れ子になったループから飛び出すには、通常、ブール型変数を使用し、ループ内でこの変数をチェックする必要があります。私たちがi
とj
反復しているとすれば、このように見えるかもしれません
size_t i,j;
for (i = 0; i < myValue && !breakout_condition; ++i) {
for (j = 0; j < mySecondValue && !breakout_condition; ++j) {
... /* Do something, maybe modifying breakout_condition */
/* When breakout_condition == true the loops end */
}
}
しかし、C言語ではgoto
節が提供されていますが、この場合は便利です。ループの後に宣言されたラベルを使用することで、ループから簡単に切り離すことができます。
size_t i,j;
for (i = 0; i < myValue; ++i) {
for (j = 0; j < mySecondValue; ++j) {
...
if(breakout_condition)
goto final;
}
}
final:
しかし、しばしばこの必要性が現れたreturn
、 return
代わりに使用するほうがよいでしょう。この構造体は、構造的プログラミング理論においても「非構造化」と考えられている。
goto
が役に立つ別の状況は、エラーハンドラにジャンプすることです。
ptr = malloc(N * x);
if(!ptr)
goto out_of_memory;
/* normal processing */
free(ptr);
return SUCCESS;
out_of_memory:
free(ptr); /* harmless, and necessary if we have further errors */
return FAILURE;
goto
を使用すると、通常のプログラム制御フローとは別のエラーフローが維持されます。しかし、それはまた、技術的な意味において「非構造化」と考えられている。
リターンを使う
値を返す
一般的に使用されるケースの1つ: main()
#include <stdlib.h> /* for EXIT_xxx macros */
int main(int argc, char ** argv)
{
if (2 < argc)
{
return EXIT_FAILURE; /* The code expects one argument:
leave immediately skipping the rest of the function's code */
}
/* Do stuff. */
return EXIT_SUCCESS;
}
その他の注意事項:
戻り値の型が
void
(void *
や関連する型を含まない)の関数の場合、return
文には関連する式が含まれてはいけません。つまり、唯一許されるreturn文はreturn;
。非
void
戻り値型を持つ関数の場合、return
文は式なしでは出現してはならない。以下のために
main()
とのみのためmain()
明示的なreturn
文は(C99以降に)必要とされていません。実行が終了に達した場合}
、暗黙の値0
が返されます。このreturn
省略するreturn
は悪い習慣だと思う人もいます。他の人は積極的にそれを放置することを提案する。
何も返さない
void
関数からのvoid
値
void log(const char * message_to_log)
{
if (NULL == message_to_log)
{
return; /* Nothing to log, go home NOW, skip the logging. */
}
fprintf(stderr, "%s:%d %s\n", __FILE__, _LINE__, message_to_log);
return; /* Optional, as this function does not return a value. */
}
ブレークと継続を使用する
すぐにcontinue
無効な入力に読み取りまたはbreak
ユーザの要求やファイルの終わりに:
#include <stdlib.h> /* for EXIT_xxx macros */
#include <stdio.h> /* for printf() and getchar() */
#include <ctype.h> /* for isdigit() */
void flush_input_stream(FILE * fp);
int main(void)
{
int sum = 0;
printf("Enter digits to be summed up or 0 to exit:\n");
do
{
int c = getchar();
if (EOF == c)
{
printf("Read 'end-of-file', exiting!\n");
break;
}
if ('\n' != c)
{
flush_input_stream(stdin);
}
if (!isdigit(c))
{
printf("%c is not a digit! Start over!\n", c);
continue;
}
if ('0' == c)
{
printf("Exit requested.\n");
break;
}
sum += c - '0';
printf("The current sum is %d.\n", sum);
} while (1);
return EXIT_SUCCESS;
}
void flush_input_stream(FILE * fp)
{
size_t i = 0;
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF) /* Pull all until and including the next new-line. */
{
++i;
}
if (0 != i)
{
fprintf(stderr, "Flushed %zu characters from input.\n", i);
}
}