サーチ…


構文

  • 戻り値。 / *現在の関数から返ります。 valは、関数の戻り値の型に変換される任意の型の値にすることができます。 * /
  • 戻る; / *現在のvoid関数から返ります。 * /
  • ブレーク; / *反復ステートメント(ループ)の終わりを超えて無条件に飛び越したり、最も内側のswitch文から飛び越したりします。 * /
  • 持続する; / *反復ステートメント(ループ)の先頭に無条件にジャンプします。 * /
  • LBLに行く。 / *ラベルLBLにジャンプします。 * /
  • LBL: statement / *同じ関数内の任意のステートメント。 * /

備考

これらはキーワードでCに統合されたジャンプです。

Cには、データ型、 jmp_buf 、およびCライブラリ呼び出しsetjmplongjmp指定された別のジャンプ構造long jumpがあります。

も参照してください

反復ステートメント/ループ:for、while、do-while

gotoを使用して入れ子になったループから飛び出す

入れ子になったループから飛び出すには、通常、ブール型変数を使用し、ループ内でこの変数をチェックする必要があります。私たちがij反復しているとすれば、このように見えるかもしれません

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:

しかし、しばしばこの必要性が現れたreturnreturn代わりに使用するほうがよいでしょう。この構造体は、構造的プログラミング理論においても「非構造化」と考えられている。

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;
}

その他の注意事項:

  1. 戻り値の型がvoidvoid *や関連する型を含まない)の関数の場合、 return文には関連する式が含まれてはいけません。つまり、唯一許されるreturn文はreturn;

  2. void戻り値型を持つ関数の場合、 return文は式なしでは出現してはならない。

  3. 以下のために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);
  }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow