Оператор выбора if в языке C


Главное в действие данное оператора - это условие. if в переводе с английского значит если . Условие принимается в качестве аргумента (то что в скобках). В качестве условия может выступать логическое выражение или логическая переменная. Если проще, то смысл выражения будет такой:

If (условие){
условие выполнено, делаем так
}
else
{
условие не выполнено, делаем иначе
}
Надеюсь логика условной операции понятна. Теперь давайте рассмотрим пример.

$a = 5;
$b = 25;

// Теперь внимание! Условие: Если $b больше $a
// Знаки > и < , как и в математике, обозначают больше и меньше
if($b > $a)
{
// если условие выполнено, то выполняем это действие
echo "$b больше $a";
}
else
{
// если не выполнено, то это
echo "$a больше или равно $b";
}
?>
Демонстрация Скачать исходники
В итоге скрипт выведет 25 больше 5 . Пример довольно прост. Надеюсь всё понятно. Теперь предлагаю рассмотреть ситуацию сложнее, где нужно соблюсти несколько условий. Каждое новое условие будет содержать после основного условия if() - вспомогательное, которое записывается как else if() . В конце как обычно будет else .

Задача: В школе проводят тестирование. Скрипту нужно высчитать балл, зная условия получения каждой оценки и сам балл школьника. Давайте посмотрим как это записать, и не забудьте прочитать комментарий.

$test = 82; // допустим школьник написал тест на 82 балла

// первое условие напишем для пятёрки
if($test > 90)
{
// если условие соблюдено, то выполняем это действие.
echo "Оценка 5";
}
// Знак && обозначает "и, объединение", что условие соблюдено если и то, и то верно
// то есть балл меньше 91 и больше 80, тогда 4. Иначе условия считываются дальше
else if ($test < 91 && $test > 80)
{
echo "Оценка 4";
}
else if ($test < 81 && $test > 70)
{
echo "Оценка 3";
}
else
{
echo "Надо бы ещё раз написать тест...";
}
?>
Демонстрация Скачать исходники
Наш школьник, который успевает и отдохнуть, и написать нормально тест получает оценку 4 ! А принцип работы надеюсь понятен.

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

$age = 19; // переменная с возрастом

If ($age > 17){
echo "Всё! Мне можно делать всё что угодно! Мне уже $age!";
}
Вполне себе милый пример короткой записи условной операции. else писать не обязательно.

Операторы сравнения в PHP

Принцип работы условной операции понятен. Но, как Вы понимаете, способов сравнить намного больше. Давайте посмотрим ниже на таблицу с операторами сравнения.

Пример Название Результат
$a == $b Равно True, если $a равно $b
$a === $b Идентично True, если $a равно $b и обе переменных принадлежат одному типу
$a != $b Не равно True, если $a не равно $b
$a === $b Не идентично True, если $a не равно $b и оба их типа не совпадают
$a > $b Больше чем True, если $a больше, чем $b
$a < $b Меньше чем True, если $a меньше, чем $b
$a >= $b Больше или равно True, если $a больше или равно $b
$a <= $b Меньше или равно True, если $a меньше или равно $b
Теперь рассмотрим операторы на примерах :

// вопреки привычке = значит присваивание значение переменной, а == как равно
if ($a == 5){
echo "$a равно 5"; // выведет "5 равно 5"
} else {
echo "$a не равно 5";
}

If ($a != 6){
echo "$a не равно 6"; // выведет "5 не равно 6". Нужно в случае отрицания
} else {
echo "$a каким-то образом равно 6";
}

// с больше и меньше думаю всё понятно. Поэтому пример сложнее
if ($a <= 6){
echo "$a меньше или равно 6"; // выведет "5 меньше или равно 6"
} else {
echo "$a больше 6";
}

Логические операторы PHP

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

Пример Название Результат
$a and $b Логическое "и" TRUE если и $a, и $b TRUE.
$a or $b Логическое "или" TRUE если или $a, или $b TRUE.
$a xor $b Исключающее "или" TRUE если $a, или $b TRUE, но не оба.
! $a Отрицание TRUE если $a не TRUE.
$a && $b Логическое "и" TRUE если и $a, и $b TRUE.
$a || $b Логическое "или" TRUE если или $a, или $b TRUE.
Уже обратили внимание, что для операций и и или есть дополнительные операторы? Так сделано для того, чтобы расставить приоритеты в сложных операциях сравнения. В таблице логические операторы приведены в порядке приоритета: от меньшего к большему, то есть, например, || имеет больший приоритет, чем or.

Переходим к примерам

$a = 5;
$b = 6;
$c = 7;

// условие: Если 5 не равно 6 (ВЕРНО) И 6 не равно 7 (ВЕРНО)
if ($a < 6 && $b != $c){
echo "Действительно так!"; // выведет "Действительно так!" т.к. ОБА условия ВЕРНЫ
} else {
echo "Одно из условий не верно";
}

// условие: Если 6 не равно 6 (НЕВЕРНО) ИЛИ 6 не равно 7 (ВЕРНО)
if ($b != 6 || $b != $c){
echo "Всё так!"; // выведет "Всё так!", т.к. хотя бы ОДНО из условий ВЕРНО
} else {
echo "Оба условия не верны";
}

Тернарный оператор

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

Суть кода: (условие) ? значение a если true: значение a если false

Таким образом, мы сокращаем запись оператора if. Однако, данная операция действительна только с присваиванием значений переменной. Теперь давайте рассмотрим готовый пример.

// Пример использования тернарного оператора
$settings = (empty($_POST["settings"])) ? "По умолчанию" : $_POST["settings"];

// Приведенный выше код аналогичен следующему блоку с использованием if/else
if (empty($_POST["settings"])) {
$settings = "По умолчанию"; // Если ничего не передано, то оставляем "По умолчанию"
} else {
$settings = $_POST["settings"]; // Если передано, то $settings присваивается переданное значение.
}
?>
Прочитайте комментарии к коду и всё должно быть понятно.

Спасибо за внимание!


Рассмотрим организацию ввода- вывода и реализацию основных управляющих структур. Любой конкретный алгоритм может быть записан на языке программиррования, использующем только три управляющий структуры: последовательное выполнение, ветвление и повторение.
Последовательное выполнение стль обычно, что мы редко о нем вспоминаем, как об управляющей структуре. Последовательность операторов выполняется в порядке их естественнго расположения в программе, с возможным отклонением для вызова внешнего франмента (функции), но с обязательным возратом в точку вызова.
Ветвление в простейшем случае описывается в языке Си с помощью условного оператора. имеющего вид:
if (выражение)
оператор_1;
else
оператор_2;

где часть else может и отсутствовать. Сначала вычисляется "выражение" в скобках; если оно истинно то выполняется оператор_1 . Если "выражение" ложно (равно нулю - NULL ), то оператор_1 пропускается, а выполняется оператор_2 . Если на месте условно выполняемых операторов должна располагаться группа из нескольких операторов языка, то они заключаются в фигурные скобки - { }. Часто "выражение" в скобках представляет условие, заданное с помощью операций отношений и логических операций. Операции отношения обозначаются в Си следующим образом:

= = равно; ! = не равно; < меньше; > больше;
< = меньше или равно; > = больше или равно.

Символ ! в языке Си обозначает логическое отрицание. Есть еще две логические операции: || означает или, а && - логическое И . Операции отношения имеют приоретет ниже арифметических операций, так что выражение вида k > n%i вычисляется как k > (n%i). Приоритет && выше, чем у ||, но обе логические операции выполняются после операций отношения и арифметических. В сомнительных случаях лучше расставлять скобки.

Для иллюстрации применения условного оператора рассмотрим программу определения большего из трех чисел. Первый if оператор представляет полную условную конструкцию, во втором случае else отсутствует. Обратите внимание, что точка с запятой, завершая оператор присваивания max=x, не нарушает единство if - оператора. Если else - ветвь пропускается во вложенных условиях, возможна неоднозначность их толкования. Во избежание двусмысленностей решают так: else соответствует ближайшему if, не имеющего своего else .

Пример 1.3.

Рассмотрим пример программы, в которой применяются несколько вложенных друг в друга условных операторов. В этой программе сторока float A, B, X объявляет эти три переменные как величины вещественного типа. Форматная строка функции scanf предписывает ввести два вещественные числа, которые станут значениями переменных A и B соответственно.

Пример 1.4

/*РЕШЕНИЕ УРАВНЕНИЯ AX=B*/
#include
main()
{

float A,B,X;
printf("ВВЕДИ А, В\n");
scanf("%f %f",&A, &B);
if(A!=0)
printf("РЕШЕНИЕ:%f\n", B/A);
else
if(B==0)
printf("X-ЛЮБОЕ ЧИСЛО\n");
else
printf("РЕШЕНИЙ НЕТ\n");
}

Посмотрите, как выглядит ветвление, когда глубина вложенности условных операторов равна трем (пример 1.5). Если хоть одно условие истинно, то все оставшиеся, разумеется, пропускаются. При глубине вложенности условных операторов свыше трех ветвление теряет наглядность и понятность.
Для реализации многозадачного ветвления обычно прибегают к управляющей стркутуре выбор (переключатель) (см. п.9.4). Когда управляющяя структура ветвления становится особенно запутанной, определенную ясность могут внести фигурные скобки. Они обязательны, когда в условном операторе содержится более одного опрератора или функции, например

Условный оператор позволяет пропустить или выполнить некоторый блок кода в зависимости от результата вычисления указанного выражения - условия. Можно сказать, что условный оператор является точкой принятия решения в программе, иногда его также называют оператор ветвления. Если представить, что программа - это дорога, а интерпретатор PHP - путешественник, идущий по ней, то условные операторы можно представить как перекрестки, где программный код разветвляется на две или более дорог, и на таких перекрестках интерпретатор должен выбирать, по какой дороге двигаться дальше.

Оператор if

Оператор if является наиболее простым из операторов ветвлений.

Синтаксис оператора if:

Оператор if сначала вычисляет условное выражение указанное в круглых скобках, результатом этого выражения является булево значение. Если полученный результат является истинным (true), то инструкция выполняется. Если выражение возвращает ложное значение (false), то инструкция не выполняется. В качестве условия может применяться выражение любой сложности.

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

Следующий код демонстрирует применение оператора if:

Операторы if могут быть вложенными в другие операторы if:

Обратите внимание на последний пример: инструкцию не обязательно надо записывать именно под оператором if , если инструкция не большая по размеру, то ее можно записать и в одну строку.

Оператор if else

И так мы узнали, что оператор if позволяет выполнять инструкции в том случае, если условие истинно. Если же условие оказывается ложно, то никаких действий не выполняется. Однако часто бывает необходимо выполнить одни инструкции, если определенное условие истинно, и другие инструкции, если условие ложно. Именно для таких случаев используется ветвление if else . Оно состоит из оператора if , за которым следует блок инструкций и ключевого слова else , за которым следует другой блок инструкций.

Синтаксис оператора if else:

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

Немного изменив наш предыдущий пример, мы можем увидеть, как работает оператор if else , если условие возвращает значение false:

Оператор if else может быть вложенным. Такие вложенные условные операторы встречаются на практике достаточно часто. Оператор if является вложенным, если он расположен внутри другого блока if или else . Если в коде используется несколько операторов if подряд, то else всегда относится к ближайшему if:

Последний else не относится к if($a) , так как он находится не во внутреннем блоке, поэтому ближайший к нему получается if($i) . Оператор else расположенный внутри блока относится к if($b) , потому что этот if - является ближайшим к нему.

Конструкция elseif/else if

Оператор if/else вычисляет значение условного выражения и выполняет тот или иной фрагмент программного кода. Но что, если требуется выполнить один из многих фрагментов? Если вам нужно проверить несколько условий подряд, то для этого подойдет конструкция elseif или else if (это одна и та же конструкция, просто по разному записана). Формально она не является самостоятельной конструкцией PHP - это лишь распространенный стиль программирования, заключающийся в применении повторяющихся операторов if/else . Она позволяет проверять дополнительные условия, пока не будет найдено истинное или достигнут блок else . Конструкция elseif/else if должна располагаться после оператора if и перед оператором else , если такой имеется.

Здесь проверяется три условия, и, в зависимости от значения переменной $username , выполняются разные действия.

На самом деле в этом фрагменте нет ничего особенного. Это просто последовательность операторов if , где каждый оператор if является частью конструкции else предыдущего if . Для тех кто впервые столкнулся с такой формой записи и ему не очень понятно, как это работает, мы перепишем этот же пример, только в эквивалентной синтаксической форме, полностью показывающей вложенность конструкций:

Пожалуйста, приостановите работу AdBlock на этом сайте.

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

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

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

Листинг 1.

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

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

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

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

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

Листинг 2.

#include int main(void) { if (1) printf("TRUE!\n"); else printf("FALSE!\n"); return 0; }

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

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

Листинг 3.

#include int main(void) { if (0) printf("FALSE!\n"); return 0; }

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

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

Листинг 4.

#include int main(void) { int x = 12; if (!(!(x%3 == 0) && !(x%2 == 0))) printf("kratno\n"); else printf("ne kratno\n"); return 0; }

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

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

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

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

Листинг 5.

#include < 0) printf("x = %d\n", x); x = (-1)*x; printf("%d\n", x); return 0; }

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

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


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

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

Листинг 6.

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

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

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

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

Листинг 7.

#include 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 .

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

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 относится.

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

Синтаксис записи оператора выбора if else:

If (/*проверяемое условие*/) { /*тело оператора выбора 1*/; } else { /*тело оператора выбора 2*/; }

Читается так: «Если проверяемое условие истинно, то выполняется тело оператора выбора 1 , иначе (то есть проверяемое условие ложно) выполняется тело оператора выбора 2 «. Обратите внимание на то, как записан оператор if else . Слово else специально сдвинуто вправо для того чтобы программный код был понятен и его было удобно читать.

Рассмотрим задачу с предыдущей темы, с использованием if else . Напомню условие задачи: «Даны два числа, необходимо их сравнить».

// if_else.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv) { int a, b; cout << "Vvedite pervoe chislo: "; cin >> a; cout << "Vvedite vtoroe chislo: "; cin >> b; if (a >= b) // если a больше либо равно b, то { cout << a << " >= " << b << endl; } else // иначе { cout << a << " <= " << b << endl; } system("pause"); return 0; }

В данном коде нас интересуют строки 14-20 . Эти строки читаются так: если a (первое число) больше либо равно b (второе число), то выполнить оператор вывода в строке 16

Cout << a << " >= " << b << endl;

иначе выполнить оператор вывода в строке 19

Cout << a << " <= " << b << endl;

В данном ифе мы используем операции соотношений >= и <= . Условие перехода не совсем правильно, так как условие будет ложно только в том случае, если первое число будет меньше второго, во всех остальных случаях условие истинно. Значит, строку 19 нужно записать так

cout << a << " < " << b << endl; // в кавычках записать не меньше или равно, а просто меньше.

А вот так сработала программа (см. Рисунок 1).

Vvedite pervoe chislo: 15 Vvedite vtoroe chislo: -4 15 >= -4 Для продолжения нажмите любую клавишу. . .

Рисунок 1 — Оператор выбора if else

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

Условие задачи:
Составить алгоритм находящий значение y, если у=х, при х<0; у=0, при 0<=х<30; у=х 2 , при х>=30;

// inif_else.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv) { int x, y; cout << "Vvedite x: "; cin >> x; if (x < 0) { y = x; // выполняется, если х меньше нуля } else { if ((x >= 0) && (x < 30)) { y = 0; // выполняется, если х больше либо равно нуля и меньше 30 } else { if (x >= 30) { y = x * x; // выполняется, если х больше либо равен 30 } } } cout << "y=" << y << endl; system("pause"); return 0; }

В данной задаче возможны три случая:
1-й случай: х < 0 ;
2-й случай: х лежит в пределах от 0 (включая 0) до 30;
3-й случай: х больше или равен 30.

Заметьте новшество!! В 17 строке такую запись: if ((x >= 0) && (x< 30)) , я использовал символы && — это . Операция логического И && необходима для объединения нескольких простых условий в одно составное. В нашем случае необходимо проверить истинность двух условий: первое – x >= 0 , второе – х < 30 . Все проверяемое условие будет истинно, если истинны два простых условия. В математике правильной записью считается такая запись: 0 <= x < 30 , а в С++ правильной записью считается вот такая запись: (x >= 0) && (x < 30) или такая 0 <= x && x < 30 . Кстати круглые скобочки () && () не обязательны, так как условия простые, но для уверенности, я прописываю, всегда, данные скобочки и вам советую.

Разбор частного случая:

Допустим, пользователь ввел число 31. Начиная со строки 12 , выполняется проверка условий. Читается так: «Если х (31 в нашем случае) < 0, то выполнить оператор в строке 14 ». Но так как 31 > 0 условие ложно мы переходим к слову else (иначе) строка 15 . Дальше проверяем, входит ли число 31 в заданный интервал. Читается так: если х>=0 и х<30 то выполнить оператор в строке 19 . Но так как число 31 не входит в заданный интервал, то условие ложно. Подробно строка 17 : программа сначала проверит первое простое условие х >= 0 – оно истинно, а если первое истинно, то программа перейдет к проверке второго простого условия х < 30 – оно ложно. Следовательно всё составное условие ложно, ведь в составном условии у нас используется логическая операция && , а это значит, что все составное условие истинно только в том случае, когда истинны оба простых условия. Переходим к else (иначе), здесь у нас последний if , (строка 22 ). Выполняется проверка х >= 30 . Читается так: Если х >= 30 то выполнить оператор, находящийся в строке 24 . Наконец-то условие истинно, итак выполнился оператор в строке 24 . И строка 28 печатает получившееся значение. Ну, все, рассмотрели программу по мельчайшим деталям. Результат работы программы, в случае, если пользователь ввел число 31 (см. Рисунок 2)



Просмотров