プロセス制御

C 言語プログラムは順番に実行されます。つまり、前のステートメントが最初に実行され、その後に次のステートメントが実行されます。開発者がプロ​​グラム実行のフローを制御したい場合は、フロー制御の構文構造、主に条件付き実行とループ実行を使用する必要があります。

if ステートメント

if 文は条件判定に使用され、条件が満たされた場合に指定された文が実行されます。

if (式) ステートメント

上式では、式expressionが真(値が0でない)の場合、statementステートメントが実行されます。

if の後の判定条件式の外側に括弧がないとエラーになります。ステートメント本体部分の statement は、ステートメントまたは中括弧内に置かれた複合ステートメントにすることができます。以下に例を示します。

if (x == 10) printf("x は 10");

上記の例では、変数 x10 の場合、テキスト行が出力されます。ステートメントが 1 つだけあるステートメント本体の場合、通常、ステートメント部分は新しい行で始まります。

if(x==10)
  printf("x は 10\n");

複数のステートメントがある場合は、それらを中かっこで囲んで複合ステートメントを形成する必要があります。

if (line_num == MAX_LINES) {
  行番号 = 0;
  ページ番号++;
}

if ステートメントには、条件が true でない (式 expression の値が 0) 場合に実行されるコードを指定する else 分岐を持つことができます。

if (式) ステートメント
else ステートメント

以下に例を示します。

if (i > j)
  最大 = i;
それ以外
  最大 = j;

「else」のステートメント部分が複数行にわたる場合は、それらを中括弧で囲むこともできます。

「else」を別の「if」ステートメントとともに使用して、複数の判断を行うことができます。

if (式)
  声明
else if (式)
  声明
...
else if (式)
  声明
それ以外
  声明

複数の ifelse がある場合、else は常に最も近い if に一致するというこのルールを覚えておいてください。

if (数値 > 6)
  if (数値 < 12)
    printf("数値は 6 より大きく 12 未満です。\n");
それ以外
  printf("番号が違います。\n");

上の例では、「else」部分は最も近い「if」(つまり、「number < 12」)と一致するため、「number」が 6 に等しい場合、「else」部分は実行されません。

これは間違いを犯しやすいため、コードの読みやすさを向上させるために、どの if else が一致するのかを明確にするために中括弧を使用することをお勧めします。

if (数値 > 6) {
  if (数値 < 12) {
    printf("数値は 6 より大きく 12 未満です。\n");
  }
} それ以外 {
  printf("番号が違います。\n");
}

上記の例では、中括弧を使用すると、else が外側の if と一致することが明確にわかります。

三項演算子 ?:

C 言語には ?: という三項表現があり、if...else の短縮形として使用できます。

<式 1> : <式 3>

この演算子の意味は、式 expression1true (ゼロ以外の値) の場合は expression2 が実行され、それ以外の場合は expression3 が実行されるということです。

以下は 2 つの値のうち大きい方を返す例です。

(i > j) ? i : j;

上記のコードは、以下の if ステートメントと同等です。

if (i > j)
  私を返します。
それ以外
  j を返します。

switch ステートメント

switch ステートメントは、条件が複数の結果を持つ場合を判断するために使用される if...else 構造の特別な形式です。複数の「else if」をより使いやすく読みやすい形式に変更します。

スイッチ (式) {
  case value1: ステートメント
  case value2: ステートメント
  デフォルト: ステートメント
}

上記のコードでは、対応する case 分岐が式 expression のさまざまな値に基づいて実行されます。対応する値が見つからない場合は、「default」分岐が実行されます。

以下に例を示します。

スイッチ (グレード) {
  ケース0:
    printf("False");
    壊す;
  ケース1:
    printf("True");
    壊す;
  デフォルト:
    printf("不正");
}

上記の例では、変数 grade の異なる値に応じて、異なる case 分岐が実行されます。 「0」に等しい場合は「case 0」の部分を実行し、「1」に等しい場合は「case 1」の部分を実行します。それ以外の場合は「default」の部分を実行します。 default は、上記のすべての case が一致しない状況を処理することを意味します。

case ステートメント本体の最後には、break ステートメントが必要です。これは、switch 構造全体から飛び出し、実行されなくなるために使用されます。 break が欠落している場合は、次の case または default 分岐で実行が続行されます。

スイッチ (グレード) {
  ケース0:
    printf("False");
  ケース1:
    printf("True");
    壊す;
  デフォルト:
    printf("不正");
}

上記の例では、「case 0」部分に「break」文がありません。その結果、この分岐が実行された後、「switch」構造は飛び出さず、「case 1」分岐が続行されます。処刑される。

この特徴を利用して、複数の case 分岐が同じステートメント本体に対応する場合、次のように記述することができます。

スイッチ (グレード) {
  ケース0:
  ケース1:
    printf("True");
    壊す;
  デフォルト:
    printf("不正");
}

上記の例では、「case 0」分岐にはステートメントが含まれていないため、「case 0」と「case 1」の両方で同じステートメント本体が実行されます。

「case」の後のステートメント本体は中括弧で囲む必要がないため、「break」が必要です。

default ブランチは、前のケースがどれも一致しない状況を処理するために使用されます。これは、break ステートメントを記述する必要がないように、すべてのケースの後に配置するのが最適です。この分岐はオプションであり、そのような分岐がなく、すべてのケースが一致しない場合は、スイッチ コード ブロック全体が直接ジャンプされます。

while ステートメント

while ステートメントはループ構造内で使用され、条件が満たされるとループ本体が継続的に実行されます。

while (式)
  声明

上記のコードでは、式 expression が 0 以外 (true を示す) の場合、statement ステートメントが実行され、その後 expression が 0 であるかどうかが再度判断されます。 false を示す)、ループから抜け出し、ループ本体は実行されなくなります。

一方 (i < n)
  i = i + 2;

上記の例では、「i」が「n」未満である限り、「i」は 2 ずつ増加し続けます。

ループ本体に複数のステートメントがある場合は、中括弧を使用してステートメントをグループ化する必要があります。

while (式) {
  声明;
  声明;
}

以下に例を示します。

i = 0;

while (i < 10) {
  printf("i は %d になりました!\n", i);
  i++;
}

printf("すべて完了しました!\n");

上記のコードでは、ループ本体が 10 回実行され、そのたびに '10' になるまで 'i' を '1' ずつ増やしてから、ループを終了します。

while は、条件が true である限り無限ループを作成します。以下は、無限ループを記述する一般的な方法です。

一方 (1) {
  // ...
}

上記の例は無限ループですが、ループ本体内で break ステートメントを使用してループを抜け出すことができます。

do...while 構造

do...while 構造は while の変形で、最初にループ本体を 1 回実行してから、条件が満たされるかどうかを判断します。満たされている場合はループ本体の実行を続行し、満たされていない場合はループから抜け出します。

do ステートメント
while (式);

上記のコードでは、条件 expression が true であるかどうかに関係なく、ループ本体の statement が少なくとも 1 回実行されます。 statement が実行されるたびに、expression が 1 回評価され、ループを終了するかどうかが決定されます。

i = 10;

--i を実行します。
一方 (i > 0);

上記の例では、変数 i が 1 減算され、0 より大きいかどうかが判断されます。 0 より大きい場合は、「i」が「0」になるまで 1 を減算し続けます。

ループ部分に複数のステートメントがある場合は、中括弧で囲む必要があります。

i = 10;

する {
  printf("i は %d\n", i);
  i++;
while (i < 10);

printf("すべて完了しました!\n");

上記の例では、変数 i が 10 未満という条件を満たしていませんが、ループ本体は 1 回実行されます。

ステートメント用

「for」ステートメントは最も一般的に使用されるループ構造であり、通常はループの数を正確に制御するために使用されます。

for (初期化; 継続; アクション)
  声明;

上記のコードでは、「for」ステートメントの条件部分 (つまり、括弧内の部分) に 3 つの式があります。

  • initialization: ループ変数の初期化に使用される初期化式。1 回だけ実行されます。
  • continuation: 判定式。trueである限りループ本体を継続して実行します。
  • action: ループ変数処理式。ループの各ラウンドの後に実行され、ループ変数が変更されます。

ループ本体部分の「ステートメント」は、単一のステートメント、または中括弧内に配置された複合ステートメントにすることができます。以下に例を示します。

for (int i = 10; i > 0; i--)
  printf("i は %d\n", i);

上記の例では、ループ変数 ifor の最初の式で宣言されています。この変数はこのループでのみ使用されます。ループ本体から抜けた後は無効になります。

条件部分の 3 つの式のそれぞれには、カンマで区切って複数のステートメントを含めることができます。

int i, j;
for (i = 0, j = 999; i < 10; i++, j--) {
  printf("%d, %d\n", i, j);
}

上記の例では、初期化部分に 2 つのステートメントがあり、それぞれ変数 ij に値を割り当てます。

「for」の 3 つの式はいずれも必須ではなく、省略することもできます。これにより、無限ループが形成されます。

のために (;;) {
  printf("この行は無限ループで出力されます。\n" );
}

上記例では判定条件がないため無限ループとなります。

ブレークステートメント

break ステートメントは 2 つの方法で使用できます。 1 つは、特定のブランチの実行を中断するために「switch」ステートメントと組み合わせて使用​​する方法です。この使用法は以前に紹介しました。別の使用法は、ループ本体内のループから飛び出て、後続のループに進まないことです。

for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    printf("%d, %d\n", i, j);
    壊す;
  }
}

上の例では、「break」ステートメントによりループが次の「i」にジャンプします。

while ((ch = getchar()) != EOF) {
  if (ch == '\n') ブレーク;
  putchar(ch);
}

上の例では、改行文字 (\n) が読み取られると、break コマンドは while ループ全体から抜け出し、読み取りを停止します。

「break」コマンドはループ本体と「switch」構造からのみ抜け出すことができ、「if」構造から抜け出すことはできないことに注意してください。

if (n > 1) {
  if (n > 2) ブレーク;
  printf("こんにちは\n");
}

上の例では、break ステートメントは外側の if 構造から抜け出すことができないため無効です。

ステートメントを継続する

「Continue」ステートメントは、ループ本体内の現在のサイクルを終了し、次のサイクルに入るために使用されます。 「Continue」ステートメントが出現する限り、ループ本体内の後続のステートメントは実行されず、ループ本体の先頭が返されて次のサイクルの実行が開始されます。

for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    printf("%d, %d\n", i, j);
    続く;
  }
}

上の例では、 continue ステートメントがあってもなくても、効果は同じで、次の j にジャンプすることを意味します。

while ((ch = getchar()) != '\n') {
  if (ch == '\t') 続行;
  putchar(ch);
}

上記の例では、読み込んだ文字がタブ文字 (\t) である限り、 continue ステートメントを使用してその文字をスキップし、次の文字を読み取ります。

goto ステートメント

goto文は指定したラベル名にジャンプします。これは構造化プログラミングを破壊するため、構文を完全に理解するために、安易に使用しないことをお勧めします。

チャーch;

上: ch = getchar();

if (ch == 'q')
  トップに戻る;

上の例では、「top」は通常のステートメントの前に置くことができるラベル名であり、これはステートメントのこの行をマークすることと同等です。プログラムが goto ステートメントを実行すると、指定されたラベル名にジャンプします。

無限ループ:
  print("こんにちは、世界!\n");
  無限ループに移動します。

上記のコードは無限ループを作成します。

goto の主な用途の 1 つは、マルチレベル ループから抜け出すことです。

のために(...) {
  のために (...) {
    その間 (...) {
      する {
        if (何らかのエラー条件)
          保釈に行く。
      } その間(...);
    }
  }
}
    
寄託:
// ... ...

上記のコードには非常に複雑なループが入れ子になっており、goto を使用しない場合、すべてのループから完全に抜け出すように記述するのは非常に面倒です。

goto のもう 1 つの用途は、複数の判定を早期に終了することです。

if (do_something() == エラー)
  ジャンプエラー;
if (do_something2() == エラー)
  ジャンプエラー;
if (do_something3() == エラー)
  ジャンプエラー;
if (do_something4() == エラー)
  ジャンプエラー;

上記の例では4つの判定があり、そのうちの1つでエラーが見つかった場合は、gotoを使用してそれ以降の判定をスキップします。

goto は同じ関数内でのみジャンプでき、他の関数にはジャンプできないことに注意してください。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0