Поиск…


if () Заявления

Один из самых простых способов контролировать ход выполнения программы заключается в использовании , if заявления выбора. Независимо от того, должен ли исполняться блок кода или не быть выполнен, это утверждение можно решить.

Синтаксис if оператор выбора в C может быть следующим:

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

Например,

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

Где a > 1 - это условие , которое должно оцениваться в true для выполнения операторов внутри блока if . В этом примере «a больше 1» печатается только, если a > 1 истинно.

if операторы выбора могут опускать скобки для переноски { и } если в блоке есть только один оператор. Вышеприведенный пример можно переписать в

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

Однако для выполнения нескольких операторов в блоке необходимо использовать фигурные скобки.

Условие if может включать несколько выражений. if будет выполняться только действие, если конечный результат выражения равен true.

Например

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

будет выполнять только printf и a++ если и a и b больше 1 .

if () ... else и синтаксис

Если if выполняет действие только тогда, когда его условие оценивается как true , if / else позволяет вам указать разные действия, когда условие true и когда условие false .

Пример:

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

Так же, как и оператор if , когда блок внутри if или else состоит только из одного оператора, то фигурные скобки могут быть опущены (но делать это не рекомендуется, так как это может легко ввести проблемы непроизвольно). Однако, если в блоке if или else имеется более одного оператора, то на этом конкретном блоке должны использоваться фигурные скобки.

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

Если значение равно 1 , когда a switch используется оператор, a is 1 будет печататься. Если значение a равно 2, тогда будет напечатан a is 2 . В противном случае a is neither 1 nor 2 будет напечатано a is neither 1 nor 2 .

case n: используется для описания того, где будет выполняться поток выполнения, когда значение, переданное в оператор switch равно n . n должна быть константой времени компиляции, и одно и то же n может существовать не более одного раза в одном операторе switch .

default: используется для описания того, когда значение не соответствует ни одному из вариантов для case n: Хорошей практикой является включение случая по default в каждый оператор switch для обнаружения неожиданного поведения.

break; оператор должен выпрыгнуть из блока switch .

Примечание. Если вы случайно забыли добавить break после окончания case , компилятор предположит, что вы намереваетесь «провалиться», и все последующие операторы case, если таковые имеются, будут выполнены (если оператор break не найден в любой из последующих случаев), независимо от того, соответствуют ли последующие утверждения (-ы) случая. Это конкретное свойство используется для реализации устройства Даффа . Такое поведение часто считается недостатком в спецификации языка C.

Ниже приведен пример, показывающий эффекты отсутствия 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 2 а a is 1, 2 or 3 , оба будут напечатаны. Когда a равно 3, будет напечатано только a is 1, 2 or 3 . В противном случае a is neither 1, 2 nor 3 будет напечатано a is neither 1, 2 nor 3 .

Обратите внимание, что случай по default не нужен, особенно когда набор значений, которые вы получаете в switch , завершен и известен во время компиляции.

Лучшим примером является использование switch enum .

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: есть ли другие значения 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 Лестница Цепочка двух или более операторов if () ... else

Хотя оператор if ()... else позволяет определить только одно (по умолчанию) поведение, которое возникает, когда условие внутри if () не выполняется, объединение двух или более операторов if () ... else позволяет определить пару больше поведения , прежде чем идти до последнего 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 Лестница

Вложенные операторы if()...else принимают большее время выполнения (они медленнее) по сравнению с лестницей if()...else потому что вложенные операторы if()...else проверяют все внутренние условные операторы после внешнего условное выполнение if() выполняется, тогда как лестница if()..else прекратит тестирование условий, как только истинные условные утверждения if() или else if() верны.

Линия 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 :

#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