Основы программирования на C: логика и управление потоком

13

Большинство людей считают, что программирование связано со сложными алгоритмами. На самом деле это не так. В основном это сводится к принятию простых решений. В языке 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 изменяется. Это редко то, что вы хотите, когда намеревались сравнить значения. Хотя эта возможность присваивания внутри условия может быть полезна в определенных контекстах, она является ловушкой для невнимательных. Будьте осторожны с использованием = и ==. Одна опечатка меняет всё.