Більшість людей вважають, що програмування пов’язане із складними алгоритмами. Насправді, це не так. Здебільшого це зводиться до ухвалення простих рішень. У мові 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 змінюється. Це рідко те, що ви хочете, коли мали намір порівняти значення. Хоча ця можливість присвоювання всередині умови може бути корисною у певних контекстах, вона є пасткою для неуважних. Будьте обережні з використанням = та ==. Одна помилка змінює все.




























































