C не просто виконує код лінійно. Він ухвалює рішення. В основі кожного рішення, яке приймає програма на C, лежить булевий вираз. Незалежно від того, чи використовуєте ви оператор if або цикл while, логіка зводиться до одного питання: істинно це умова чи хибно?
Розглянемо базовий приклад.
`
Тут програма вимагає введення. Вона зберігає це число у змінній b. Потім вона перевіряє умову. Булеве вираз, про яке йдеться, – це (b < 0). З обчислює його. Якщо результат дійсний, програма виводить The value is negative. Якщо він складний, програма нічого не робить. Вона мовчить.
Правило просте. Якщо вираз обчислюється як True (істина), C виконує єдиний рядок, безпосередньо наступний за if. Або якщо ви використовуєте фігурні дужки {}, він виконує весь блок усередині. Якщо вираз False (брехня), C повністю пропускає цей рядок або блок.
Але програми рідко мають справу лише з одним результатом. Вам часто потрібно обробляти також нуль чи позитивні числа.
`
Ця структура використовує else if і else для охоплення випадків, що залишилися. Вона перевіряє нуль наступним. Якщо це вдається, вона передбачає, що значення позитивно.
Іноді рішення ускладнюються. Вам може знадобитися перевірити кілька умов одночасно.
`
Це твердження читається як природна мова. Якщо x дорівнює y та j більше k, то встановіть z в 1. В іншому випадку встановіть q в 10. Ви будете використовувати подібні твердження протягом усієї своєї кар'єри в C. Більшість рішень будуть простими. Іноді можуть стати складними.
Уважно стежте за синтаксисом. Поширена помилка для початківців – плутанина між присвоєнням та порівнянням.
C використовує == для перевірки на рівність.
C використовує = для присвоювання значення змінної.
Їхнє переплутування призводить до помилок, які важко знайти. Одне встановлює значення. Інше перевіряє умову. Вони не взаємозамінні.
C також спирається на специфічні оператори логічних операцій. Символ && є логічною операцією І (AND). Він гарантує, що обидві сторони умови мають бути дійсними.
Ось коротка довідкова інформація щодо всіх булевих операторів у C:
- == : рівність
- != : нерівність
- < : менше ніж
- > : більше ніж
- <= : менше або одно
- >= : більше або одно

Циклічна логіка в C: while, do-while та for
Використання циклу while є простим. Він відбиває простоту стандартного оператора if. Розглянемо цей фрагмент коду:
while (a < b) { printf("%d\n", a); a = a + 1; }
Ця структура повторює виконання двох рядків, що усередині фігурних дужок. Вона зупиняється лише тоді, коли a стає більше або дорівнює b. Логіка лінійна. Перевірити умову. Виконати тіло циклу. Повторити.
C також пропонує конструкцію do-while. На відміну від стандартного циклу, коли вона перевіряє умову після першого виконання. Це гарантує, що блок коду виконається щонайменше один раз.
`
Примітка: Наведений вище приклад використовує оператор if всередині функції. Справжній цикл do-while обертав би тіло циклу та перевіряв умову наприкінці.
Цикл for як скорочений запис
Цикл for по суті є стислим записом оператора while. Він поєднує ініціалізацію, перевірку та збільшення значення в один рядок.
Подивіться цей стандартний цикл while:
x=1;
while (x<10) {
blah blah blah
x++; // x++ ідентично x=x+1
}
Ви можете переписати це як цикл for:
for(x=1; x<10; x++) { blah blah blah }
Компоненти очевидні. x=1 виконує ініціалізацію. x<10 виконує перевірку. x++ збільшує значення. Цикл for просто стискає їх. Ви не обмежені простими змінними. Ви можете помістити складну логіку у ці секції.
Розглянемо цей приклад:
a=1;
b = 6;
while (a < b) {
a++;
printf("%d\n",a);
}
Він перетворюється на:
for (a=1,b=6; a < b; a++,printf("%d\n",a));
Це працює. Це також заплутано. Оператор кома дозволяє використовувати кілька операторів у секціях ініціалізації та збільшення. Він не працює у секції перевірки. Багато розробників C люблять цю компактність. Інші вважають її нечитаною. Вони розбивають код на частини. Обидва підходи допустимі. Вибирайте залежно від того, хто підтримуватиме код у майбутньому.
Небезпека використання = замість == в C
Оператор == викликає головний біль. Розробники часто помилково вставляють одиночний = у логічні вирази. Компілятор приймає обидва варіанти. Поведінка сильно відрізняється.
У C логічні вирази оцінюються як цілі числа. Нуль означає False (Брехня). Будь-яке ненульове число означає True (Істина). Це означає, що будь-яке ціле число може існувати у логічному контексті.
Розглянемо цей коректний код на C:
if (a) { printf("Non-zero"); }
Якщо a дорівнює чомусь, крім 0, блок виконується.
Тепер подивіться if (a=b). Це не порівнює значення. Воно надає b змінної a, а потім перевіряє нове значення a. Якщо b дорівнює 0, умова хибна. Якщо b дорівнює чомусь ще, умова істинна. Змінна a змінюється. Швидше за все це не те, що ви планували. Ймовірно, ви мали на увазі == для порівняння.
Ця особливість не марна. Вона має обґрунтовані випадки використання. Але це пастка. Будьте обережні з використанням = та ==. Один символ змінює логіку порівняння на присвоєння.





























![[Огляд] Xiaomi MiJia M365 – відмінний [електросамокат] від надійного китайського виробника](https://web-city.org.ua/wp-content/uploads/2018/01/P1160682_1-218x150.jpg)













![[DNS probe finished no Internet] Як виправити помилку?](https://web-city.org.ua/wp-content/uploads/2018/01/1-42-218x150.jpg)






























