- •1. Знакомство со средой программирования
- •2. Создание проекта
- •3. Простейшая программа на c, функция main()
- •3. Подключение дополнительных библиотек, функция printf
- •4. Переменные, типы переменных, литералы
- •5. Форматированный вывод
- •6. Считывание данных с консоли
- •7. Условный оператор if, условные операции.
- •7.1 Оператор else
- •8. Операторы цикла while, do … while, for
- •8.1 Цикл while
- •8.2 Цикл do … while
- •8.3 Цикл for
- •9. Массивы
- •9.1 Объявление массивов
- •9.2 Инициализация массивов
- •9.3 Многомерные массивы
7. Условный оператор if, условные операции.
Как вы знаете, существует 3 базовых структуры алгоритма: последовательность (последовательное выполнение нескольких действий), ветвление (выполнение одного из двух или более действий в зависимости от некоторого условия) и цикл (выполнение некоторого действия или некоторой последовательности действий некоторое количество раз). Последовательность в языке C реализуется просто последовательным выполнением некоторых операторов:
int main()
{
оператор1;
оператор2;
оператор3;
}
Ветвление в C осуществляется несколькими способами. Один из них — это оператор if. В самом простом случае, условный оператор if выглядит следующим образом:
if (условие) оператор;
Условие в операторе if всегда пишется в скобках. Если условие истинно (true), оператор, стоящий после условия, выполняется:
#include <stdio.h>
int main()
{
if (true) printf("It's really true!\n");
printf("And it's cool!");
// output:
// It's really true!
// And it's cool!
}
Если же условие ложно (false), оператор пропускается.
#include <stdio.h>
int main()
{
if (false) printf("It's not true...\n");
printf("And it's cool!");
// output:
// And it's cool!
}
Заметьте, что операторы, стоящие после конструкции ветвления (printf("And it's cool!");) выполняются вне зависимости от того, выполнилось ли условие.
В этом примере true и false — это литералы булева типа. Вообще, строго говоря, литерал true полностью эквивалентен (равноценен) целочисленному литералу 1. То есть первый пример и следующий на самом деле идентичны:
#include <stdio.h>
int main()
{
if (1) printf("It's really true!");
printf("And it's cool!");
// output:
// It's really true!
// And it's cool!
}
Запомните, что в языке C,
Любое не нулевое значение является истиной
Зная этот простой принцип вы с легкостью сможете предугадать, какому целочисленному литералу эквивалентен логический литерал false (то есть какое значение является ложью).
Литерал false эквивалентен литералу 0
Здесь и далее синим текстом будут обозначены части методички, более детально разъясняющие некоторые вопросы.
Что вообще такое в программировании «истина» и «ложь»? Вообще, эти два понятия крайне широко используются в программировании, информатике, матлогике и прочих науках. «Истиной» является любое (вообще любое) верное утверждение. В реальной жизни таких безусловно верных утверждений найти нелегко, однако компьютер редко утруждает себя вопросами о смысле жизни. Утверждение «два равно двум» всегда верно, следовательно, оно является той самой «истиной». А утверждение «остаток от деления пяти на восемь равен нулю» всегда неверно и является «ложью». Таким образом, запись "2 == 2" — это истина (== - это операция сравнивания в C). А "5 % 8 == 0" — это ложь. Для языка C, как уже было сказано, любое ненулевое значение является истиной. Где же в записи "2 == 2" находится это самое ненулевое значение (это не числа 2)? Дело в том, что как и операция вычисления суммы двух чисел (2 + 2) возвращает (имеет результатом действия) число 4, так и операция сравнивания двух чисел (2 == 2) возвращает значение true, которое численно равняется единице. То есть результатом сравнивания является ненулевое значение, которое трактуется языком C, как истина. И то же самое с ложью. 5 % 8 возвращает 5. 5 == 0 возвращает значение false, то есть ноль, что трактуется, как ложь.
Понятное дело, что true и false условиями не являются (они являются значениями). По-этому при использовании оператора if в такой форме его сложно назвать структурой ветвления, ведь его результат очевидно предопределен. Для того, что бы использовать оператор ветвления полноценно, необходимо узнать логические операторы, доступные в C.
В C существуют следующие операторы сравнивания:
C |
Утверждение на естественном языке |
x == y |
x равно y |
x != y |
x неравно y |
x > y |
x больше y |
x >= y |
x больше или равно (неменьше) y |
x < y |
x меньше y |
x <= y |
x меньше или равно (небольше) y |
Обратите внимание (особенно если вы знаете Pascal), что в C для сравнения используется именно двойное равно! Если вы случайно напишете в условии оператора if или в другом выражении одинарное равно — компилятор не покажет ошибку, однако поведение программы будет коренным образом отличаться. Дело в том, что выражение a = b, как и выражение a == b, возвращает некоторое значение. Но если во втором случае это значение — результат сравнивания двух величин, то в первом случае это значение равно значению переменной b (именно из-за этого свойства языка С допустимо множественное присваивание вида a = b = c).
Все эти операторы можно использовать как внутри условия оператора if, так и в условных выражениях для присваивания в переменные типа bool:
int var1, var2;
printf("Input var1: ");
scanf("%d", &var1);
printf("Input var2: ");
scanf("%d", &var2);
bool condition = var1 == var2;
if (condition) printf("Values are equal");
if (var1 > var2) printf("val1 is greater than val2");
В этом примере если обе переменные будут равны после ввода с клавиатуры, то в булеву переменную condition будет установлено значение true. В этом случае условие в первом из двух операторов if будет истинным и на экран выведется текст «Values are equal». Если же первая переменная будет больше второй переменной то условное выражение во втором операторе if вернет значение true, и на экран будет выведен текст «val1 is greater then val2». Есть и третий вариант — когда первое значение будет меньше второго. В этом случае не сработают оба условия и на экран не будет выведено ничего.
Иногда существуют ситуации, когда в зависимости от какого-то условия необходимо выполнить не одно действие, а несколько. В этом случае необходимо использование составного оператора { }. Рассмотрим пример, в котором с клавиатуры вводятся 2 целочисленных значения, если первое из них больше второго, то они меняются местами, в конце переменные выводятся на экран в порядке возрастания.
#include <stdio.h>
int main() {
int first, second; // переменные, которые будут хранить введенные значения
printf("Input 2 integers: ");
scanf("%d %d", &first, &second); // ввод значений
if (first > second) { // если первое значение больше — нужно поменять переменные значениями
int temp = first; // что бы не потерять первое значение — оно заносится во временную переменную
first = second; // в первую переменную заносится значение второй переменной, т.е. в обеих переменных одинаковое значение (их второй переменной)
second = temp; // первое значение восстанавливается из временной переменной и записывается во вторую переменную
}
printf("%d %d", first, second);
}