Главная > Уроки > Условный оператор if -- else

Записывайся на этот курс на Stepike!

Условный оператор if -- else

Теперь, когда с условными выражениями разобрались, можно переходить к основной теме урока – условному оператору.

Шаблон оператора if -- else

Тут возможны два основных варианта:

Листинг 1.

// первый вариант
if (условное_выражение)
  оператор_1;
  
// второй вариант
if (условное_выражение)
  оператор_1;
else
  оператор_2;

Ну и картинки, конечно. Куда же без картинок?

Блок-схемы оператора if-else

Рис.1 Блок-схемы оператора if-else.

Работает этот оператор так. Вычисляется значение условного выражения. Если получается истина, то выполняется оператор_1 из основной ветки, а если ложь, то либо ничего не происходит (в первом варианте), либо выполняется оператор_2 из побочной ветки (во втором варианте).

Предлагаю сразу на примерах разбираться. Например, как вы думаете, что выведет на экран следующий код? Проверьте свою догадку.

Листинг 2.

#include <stdio.h>

int main(void) { 

  if ( 1 ) 
    printf("TRUE!\n");
  else
    printf("FALSE!\n");
 
  return 0;
}

Ну да, правильно, он выведет TRUE!. Условие же истинно. Вы же ещё не забыли, что единица – это истина? Я сейчас страшное скажу. Любое ненулевое число воспринимается как истина. Проверьте это самостоятельно.

Ну ладно, а теперь вот такой пример. Что по-вашему выведет данная программа?

Листинг 3.

#include <stdio.h>

int main(void) { 

  if ( 0 ) 
    printf("FALSE!\n"); 
 
  return 0;
}

Надеюсь, вы дали правильный ответ и вас не смутила строчка с выводом FALSE!, которое я специально добавил, чтобы запутать вас. Да, эта программа ничего не выведет. Условие в скобах ложно, а значит, оператор не будет выполнен. Всё по правилам.

Давайте ещё один примерчик, для закрепления. Будьте предельно внимательны, я там подготовил для вас всякого. Итак, что выведет данный код?

Листинг 4.

#include <stdio.h>

int main(void) { 

  int x = 12; 

  if ( !( !( x%3 == 0) && !( x%2 == 0 ) ) ) 
    printf("kratno\n");
  else 
    printf("ne kratno\n");

  return 0;
}

Верю, что у вас всё получилось! Если не получилось, не расстраивайтесь – ещё будет время потренироваться.

Ну а сейчас давайте о нюансах – они, как обычно, имеются.

Нюанс 1.

В каждой ветке условного оператора может быть записан лишь ОДИН оператор.

Вот, посмотрите на пример.

Листинг 5.

#include <stdio.h>

int main(void) { 

  int x = 0; 
  scanf("%d", &x);

  if ( x < 0 )
    printf("x = %d\n", x);
    x = (-1)*x;

  printf("%d\n", x);

  return 0;
}

Кажется, что программа должна работать следующим образом. Пользователь вводит целое число. Если число меньше нуля, то меняем его знак на противоположный. В противном случае ничего не делаем. После этого выводим число на экран консоли.

А теперь внимание на экран.

Результат работы программы Листинг 11

Рис.2 Результат работы программы Листинг 11

Но решение есть! И это решение – составной оператор {}. Если мы заключим несколько операторов в фигурные скобки, то они будут восприниматься как один единый оператор. Поэтому, чтобы программа заработала правильно, добавим в неё составной оператор:

Листинг 6.

#include <stdio.h>

int main(void) { 

  int x = 0; 
  scanf("%d", &x);

  if ( x < 0 ){
    printf("x = %d\n", x);
    x = (-1)*x;
  }

  printf("%d\n", x);

  return 0;
}

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

Нюанс 2

Внутри управляющей конструкций if-else можно использовать любые конструкции языка, в том числе ещё одну конструкцию if-else.

Вот так например:

Листинг 7.

#include <stdio.h>

int main(void) { 

  int x = 0; 
  scanf("%d", &x);

  if ( x < 0 ) {
    printf("Negative!\n");
  } else {
    if ( x == 0 ){
      printf("Zero!\n");
    } else {
      printf("Positive!\n");
    }
  }
  return 0;
}

Думаю, понятно, что используя вложенные условные операторы, вы можете сделать конструкцию аналогичную оператору выбора switch.

Использование вложенных условных операторов порождает ещё одну особенность.

Нюанс 3

else всегда относится к ближайшему if, у которого нет своего else

Для примера:

Листинг 8.

if ( n > 0 )
  if ( а > b )
    z = a;
  else
    z = b;

Согласно нашему правилу, else относится к внутреннему (второму) if. Если хотим, чтобы else относился к внешнему (первому) if, то можно воспользоваться составным оператором.

Листинг 9.

if ( n > 0 ) {
  if (а > b)
    z = a;
} else
  z = b;

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

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров:

  1. В языке Си существует ещё одна конструкция, работающая с условными выражениями. Это тернарная условная операция ?:. Самостоятельно найдите в интернете описание этой конструкции и изучите, как она работает.

Дополнительные материалы

  1. Задачи на условный оператор от Яндекса

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

Инна
Отличный урок, спасибо! Усвоила для себя информацию которую не нашла в других источниках. А есть pdf-файл на данный урок?
KaDeaT
И вам спасибо! К сожалению, pdf-файла пока нет, но совсем скоро будет.
cssfish
неясно, почему не упомянули else if
с ним решать задачи куда удобнее, чем писать вложенное ветвление
Montel'
А если в тернарной условной операции к примеру o1 ? o2 : o3 нам нужно чтоб в результате - истина т.е. o2 что то происходило, а когда ложь ничего не происходило. Можно ли оставить данное вырождение без o3 и как эти инструкции записать корректно?
Ardellen
Добрый день, объясните, пожалуйста, почему х сперва выводится на экран, и только после этого умножается на -1?
#include <stdio.h>

int main(void) {

int x = 0;
scanf("%d", &x);

if ( x < 0 ){
printf("x = %dn", x);
x = (-1)*x;
}

printf("%dn", x);

return 0;
}
Valeriy
Не понимаю почему когда запускаю код, условие проходит, пишет "open", но решение не принимается


  

int main(void) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if ( (a||b||c==2) && (a||b||c==4) && (a||b||c==8)) {
printf("open");}
else
printf("close");
return 0;
}