Большинство людей считают, что программирование связано со сложными алгоритмами. На самом деле это не так. В основном это сводится к принятию простых решений. В языке C эти решения зависят от одного: логических выражений (Boolean expressions).
Вы уже встречали их в операторах if и циклах while. Это светофоры вашей программы. Зеленый — идем, красный — стоим.
Возьмем этот простой пример.
Программа запрашивает число. Она проверяет, меньше ли это число нуля. Если да, программа выводит сообщение. Если нет? Тишина.
Часть (b < 0) — это логическое выражение. C оценивает его. Истина означает выполнение следующей строки. Ложь означает пропуск этой строки. Просто.
Но что происходит, когда нужна более тонкая логика?
Обработка нуля и положительных значений
Приведенная выше одиночная проверка оставляет пробел. Что, если пользователь введет ноль? Или положительное целое число? Программа проигнорирует их.
Вот немного более сложная структура.
Теперь у вас есть логика для отрицательных, нулевых и положительных значений. Разделы else if и else обрабатывают остальные случаи. Это все еще базовый уровень, но он покрывает все варианты.
Сложные условия и типичные ошибки
Реальная логика редко остается простой. Иногда вам нужно, чтобы два условия были истинными одновременно.
Рассмотрим эту строку:
Читайте её как английский текст. Если x равен y И j больше k, установите z равным 1. В противном случае установите q равным 10.
Обратите внимание на операторы.
C использует == для проверки равенства. Он использует одиночный = для присваивания значения.
Это классическая ловушка. Если вы напишете if (x = y), вы не проверяете, равны ли они. Вы присваиваете y переменной x, а затем проверяете, является ли результат ненулевым. Ваша логика нарушается. Всегда используйте двойное равенство для сравнений.
Символ && представляет логическую операцию И. Обе части должны быть истинными.
Полный набор логических операторов
Вам не нужно запоминать их наизусть, но вы должны знать, как они выглядят. Они повсюду в коде на C.
- Равенство :
== - Неравенство :
!= - Меньше :
< - Больше :
> - Меньше или равно :
<= - Больше или равно :
>= - И :
&& - ИЛИ :
|| - НЕ :
!
Почему это важно для обычных пользователей
Логика циклов в C: конструкции while, do-while и for
Вы можете использовать циклы while с такой же легкостью, как и простые операторы if. Рассмотрим простой пример:
Этот код повторяет эти две строки до тех пор, пока a не станет больше или равно b. Структура предельно проста. В C также предусмотрена конструкция do-while, которая гарантирует выполнение блока кода как минимум один раз перед проверкой условия. Вот фрагмент, демонстрирующий базовую проверку ввода:
Как цикл for упрощает итерации
Цикл for по сути является сокращенной записью цикла while. Если у вас есть такой код:
Вы можете сжать его в одно выражение for :
Цикл while состоит из трех отдельных частей: инициализации (x=1 ), проверки (x<10 ) и инкремента (x++ ). Цикл for упаковывает их в одну строку. Однако вы не ограничены использованием простых переменных. Посмотрите на более сложный сценарий:
Вы можете переписать это с использованием цикла for :
Выглядит загроможденно. Это запутанно. Но это работает. Оператор запятой позволяет объединять несколько выражений в секциях инициализации и инкремента цикла for. Однако вы не можете поставить запятую в секции проверки условия.
Многие программисты на C любят упаковывать логику в одну строку. Другие утверждают, что это разрушает читаемость. Единого консенсуса нет. Вам просто нужно решить, что для вас важнее: краткость или ясность.
Опасность использования = вместо == в логических выражениях
Двойной знак равенства == является источником частых ошибок в C. Разработчики часто по ошибке пишут одинарный знак равенства =. Компилятор принимает оба варианта, но поведение кардинально различается.
В C логические выражения оцениваются как целые числа. Ноль означает False (Ложь). Любое ненулевое целое число означает True (Истина). Это означает, что вы можете законно записать:
Но что произойдет, если вы напишете if (a=b)?
Это не сравнение. Это присваивание. Выражение if (a=b) присваивает значение b переменной a, а затем проверяет полученное значение a на его логическую истинность. Если a становится равным нулю, условие считается False (Ложь). Если оно становится любым другим значением, условие считается True (Истина).
В процессе этого действия значение переменной a изменяется. Это редко то, что вы хотите, когда намеревались сравнить значения. Хотя эта возможность присваивания внутри условия может быть полезна в определенных контекстах, она является ловушкой для невнимательных. Будьте осторожны с использованием = и ==. Одна опечатка меняет всё.



























