Ви змішуєте багато різних речей: оператори управління, оператори та логічні типи. У кожного свої правила.
ifОперативні оператори працюють, як, наприклад, твердження, C11 6.4.8.1:
В обох формах перший підзапис виконується, якщо вираз порівнює нерівне 0.
while, forтощо мають те саме правило. Це не має нічого спільного з "істинним" чи "хибним".
Що стосується операторів, які нібито дають булевий результат, вони насправді дають intзначення зі значенням 1 або 0. Наприклад, оператори рівності, C11 6.5.9:
Кожен з операторів видає 1, якщо вказане відношення є істинним, і 0, якщо воно хибне
Все вищесказане пояснюється тим, що C не мав логічного типу до 1999 року, і навіть коли він отримав такий, вищезазначені правила не були змінені. Отже, на відміну від більшості інших мов програмування, де оператори та оператори видають логічний тип (наприклад, C ++ та Java), вони просто дають значення intзі значенням нуль чи ні. Наприклад, sizeof(1==1)дасть 4 на C, але 1 на C ++.
Фактичний булевий тип на мові C називається _Boolі вимагає сучасного компілятора. Заголовок stdbool.hвизначає макроси bool, trueі false, які розширюються до _Bool, 1і 0відповідно (для сумісності з C ++).
Однак вважається хорошою практикою програмування поводитися з операторами управління та операторами так, ніби вони насправді вимагали / дали булевий тип. Деякі стандарти кодування, такі як MISRA-C, рекомендують таку практику. Це є:
if(ptr == NULL)замість if(ptr).
if((data & mask) != 0)замість if(data & mask).
Метою такого стилю є підвищення безпеки типу за допомогою інструментів статичного аналізу, що в свою чергу зменшує помилки. Можливо, цей стиль має значення лише у тому випадку, якщо ви використовуєте статичні аналізатори. Хоча в деяких випадках, наприклад, це призводить до більш читабельного коду, що самодокументується
if(c == '\0')
Добре, намір зрозумілий, код самодокументується.
проти
if(c)
Погано Це може означати що завгодно, і нам доведеться шукати тип, cщоб зрозуміти код. Це ціле число, вказівник чи символ?