Розуміння потоку управління в C: логіка та умовні оператори

1

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 змінюється. Швидше за все це не те, що ви планували. Ймовірно, ви мали на увазі == для порівняння.

Ця особливість не марна. Вона має обґрунтовані випадки використання. Але це пастка. Будьте обережні з використанням = та ==. Один символ змінює логіку порівняння на присвоєння.