サーチ…


if()ステートメント

プログラムフローを制御する最も簡単な方法の1つは、 if文を使用ifことです。この文でコードのブロックを実行するかどうかを決定することができます。

Cのif選択文の構文はif次のようになります。

if(cond) 
{
  statement(s);  /*to be executed, on condition being true*/
}

例えば、

if (a > 1) {
    puts("a is larger than 1");
}

ここでa > 1は、 ifブロック内のステートメントを実行するためにtrueと評価する必要がある条件です。この例では、 "a is greater than 1"は、 a > 1場合にのみ出力されます。

if選択ステートメントは包装中括弧を省略することができ{}ブロック内の唯一のステートメントがある場合。上記の例は、次のように書き直すことができます。

if (a > 1)
    puts("a is larger than 1");

しかし、ブロック内で複数のステートメントを実行するには、中括弧を使用する必要があります。

if条件には、複数の式を含めることができます。 expressionの最終結果がtrueのifにのみアクションを実行します。

例えば

if ((a > 1) && (b > 1)) {
    puts("a is larger than 1");
    a++;
}

ab 両方1より大きい場合にのみ、 printfa++実行します。

if()... elseステートメントと構文

一方でif 、その条件はと評価された場合にのみアクションを実行trueif / elseあなたは時に条件の異なるアクションを指定することができますtrueと条件があるときfalse

例:

if (a > 1)
    puts("a is larger than 1");
else 
    puts("a is not larger than 1");

if文のifと同様に、 ifまたはelse中のブロックが1つの文で構成されているif 、中括弧は省略できます(しかし、そうすることは、不注意で簡単に問題を引き起こす可能性があるため推奨しません)。 ifまたはelseブロック内に複数のステートメントがあるifは、その特定のブロックで中括弧を使用する必要があります。

if (a > 1) 
{
    puts("a is larger than 1");
    a--;
}
else 
{
    puts("a is not larger than 1");
    a++;
}

switch()ステートメント

switch文は、プログラムが特定のテスト変数の値に応じて多くの異なることをしたいときに便利です。

switch文の使用例は次のようになります:

int a = 1;

switch (a) {
case 1:
    puts("a is 1");
    break;
case 2:
    puts("a is 2");
    break;
default:
    puts("a is neither 1 nor 2");
    break;
}

この例は、

int a = 1;

if (a == 1) {
    puts("a is 1");
} else if (a == 2) {
    puts("a is 2");
} else {
    puts("a is neither 1 nor 2");
}

switch文が使用されているときにaの値が1の場合、 a is 1が出力されます。値場合、次に2であり、 a a is 2印刷されます。それ以外の場合a is neither 1 nor 2も印刷されa is neither 1 nor 2

case n: switch文に渡された値がnのときに実行フローがどこにジャンプするかを記述するために使用されます。 nはコンパイル時定数でなければならず、同じnが最大でも1つのswitch文に存在することができます。

default:値は、値がcase n:いずれの選択肢とも一致しなかったことを記述するために使用されdefault: 。予想外の動作を検出するには、すべてのswitch文にdefault caseを含めることをお勧めします。

break; switchブロックから飛び降りるにはステートメントが必要です。

注意: caseの終了後にbreakを追加することを誤って忘れてしまったcase 、コンパイラは「フォールスルー」し、その後に続くすべてのcase文が実行されると想定します( break文が後続のケースステートメントが一致するかどうかにかかわらず、後続のケースのいずれか)。この特定のプロパティは、 Duffのデバイスを実装するために使用されます。この動作は、しばしばC言語仕様の欠陥と見なされます。

以下は、 break;効果を示す例break;

int a = 1;

switch (a) {
case 1:
case 2:
    puts("a is 1 or 2");
case 3:
    puts("a is 1, 2 or 3");
    break;
default:
    puts("a is neither 1, 2 nor 3");
    break;
}

aの値が1または2のとき、 a is 1 or 2a is 1, 2 or 3両方を出力します。 aが3のときはaのみa is 1, 2 or 3が印刷されます。それ以外の場合、 a is neither 1, 2 nor 3印刷されa is neither 1, 2 nor 3

defaultケースは必要ではないことに注意してください。特に、 switch取得した値のセットが完了し、コンパイル時に判明している場合は注意してください。

最も良い例は、 enum switchを使用するswitchです。

enum msg_type { ACK, PING, ERROR };
void f(enum msg_type t)
{
  switch (t) {
  case ACK:
    // do nothing
    break;
  case PING:
    // do something
    break;
  case ERROR:
    // do something else
    break;
  }
}

これには複数の利点があります。

  • ほとんどのコンパイラは値を処理しないと警告を出力します( default場合は報告されません)
  • 同様の理由から、 enum新しい値を追加すると、新しい値を処理するのを忘れた場所がすべて通知されます( default場合は、そのような場合を手動で検索する必要があります)
  • 読者は、「 default:隠されているものdefault: 」、他のenum値があるかどうか、または「ちょうどの場合」の保護であるかどうかを把握する必要はありません。また、他のenum値がある場合、コーダーは意図的にdefault大文字小文字を使用しましたか、値を追加したときに導入されたバグがありますか?
  • ワイルドカードの背後に隠れることができないので、各enum値を処理することで、コードを自明にすることができます。それぞれを明示的に処理する必要があります。

それにもかかわらず、誰かが次のような邪悪なコードを書くのを防ぐことはできません:

enum msg_type t = (enum msg_type)666; // I'm evil

したがって、本当に必要な場合は、スイッチの前に余分なチェックを追加して検出することができます。

void f(enum msg_type t)
{
   if (!is_msg_type_valid(t)) {
      // Handle this unlikely error
   }

   switch(t) { 
    // Same code than before
   }
}

if()... else else複数のif()... elseステートメントを連結する

if ()... elseステートメントは、 if ()内の条件が満たされないif ()発生する1つの(デフォルト)動作を定義することができますが、2つ以上のif () ... elseステートメントを連鎖させると、もしあれば、 "default"として動作する最後のelseブランチに行く前に、より多くの振る舞いをします。

例:

int a = ... /* initialise to some value. */

if (a >= 1) 
{
    printf("a is greater than or equals 1.\n");
} 
else if (a == 0) //we already know that a is smaller than 1
{
    printf("a equals 0.\n");
}
else /* a is smaller than 1 and not equals 0, hence: */
{ 
    printf("a is negative.\n");
}

入れ子になったif()... else VS if().. else Ladder

ネストされたif()...elseステートメントは、 if()...elseステートメントのネストされたif()...elseステートメントが内部の条件文をすべてチェックしてから、 if()...elseラダーと比較して実行時間が長くなります条件付きif()文が満たされますが、 if()またはelse if()条件文のいずれかがtrueになると、 if()..elseラダーは条件テストを停止します。

if()...elseラダー:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if ((a < b) && (a < c))
  {
    printf("\na = %d is the smallest.", a);
  }
  else if ((b < a) && (b < c))
  {
    printf("\nb = %d is the smallest.", b);
  }
  else if ((c < a) && (c < b))
  {
    printf("\nc = %d is the smallest.", c);
  }
  else
  {
    printf("\nImprove your coding logic");
  }
  return 0;
}

一般的なケースでは、等価な入れ子のif()...elseよりも優れていると考えられif()...else

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if (a < b)
  {
    if (a < c)
      {
        printf("\na = %d is the smallest.", a);
      }
    else
      {
        printf("\nc = %d is the smallest.", c);
      }
  }
  else
  {
    if(b < c)
    {
      printf("\nb = %d is the smallest.", b);
    }
    else
    {
      printf("\nc = %d is the smallest.", c);
    }
  }
  return 0;  
}


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