Реляційними операторами є
> >= < <=
Вони всі мають однаковий пріоритет. Трохи нижче за пріоритетом знаходяться оператори рівності:
== !=
Реляційні оператори наділені меншим пріоритетом за арифметичні, тож вираз на зразок i < lim-1 розглядатиметься як i < (lim-1), як і очікувалось.
Цікавішими є логічні оператори && та ||. Вирази, поєднані && або ||, оцінюються з ліва на право, і їхня оцінка закінчується, як тільки виявлено істинність чи хибність результату. Більшість програм C покладаються на ці властивості. Ось, наприклад, цикл функції вводу, яку ми написали у Розділі 1:
for (i=0; i < lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
Перед тим як прочитати новий знак, необхідно перевірити, чи є місце для його збереження в масиві s, тож треба спочатку дізнатися, чи i < lim-1. Якщо ця перевірка зазнає невдачі, нам не слід продовжувати далі, і читати наступний знак.
Так само, було би недоцільно перевіряти c на предмет EOF (кінця файла), якщо до цього не викликано getchar; саме тому виклик і присвоєння мають відбутися до перевірки символу, збереженого в c.
Пріоритет && є більшим за ||, але обидва поступаються релятивним операторам і операторам рівності, тож вирази на зразок
i < lim-1 && (c=getchar()) != '\n' && c != EOF
не вимагають додаткових дужок. Але оскільки пріоритет != переважає оператор присвоєння =, дужки обов'язкові у випадку
(c=getchar()) != '\n'
для того, щоб добитися бажаного результату - спочатку, присвоєння значення c, а потім, порівняння його з '\n'.
За визначенням, числове значення релятивного або логічного виразу дорівнює 1, якщо співвідношення істинне, і 0 — якщо хибне.
Унарний оператор заперечення ! перетворює ненульовий операнд на 0 (нуль) і, навпаки, нульовий операнд на 1 (одиницю). Поширеним є застосуванням ! в конструкціях на зразок
if (!valid)
замість
if (valid == 0)
Важко узагальнити, яка з цих форм є кращою. Конструкції на кшталт !valid легко читаються («if not valid» — «якщо не дійсне»), але складніші вирази буває важко зрозуміти.
Вправа 2-2. Напишіть цикл, еквівалентний наведеному вище, але без використання && або ||.