Вы смешиваете много разных вещей: управляющие операторы, операторы и логические типы. У каждого свои правила.
Управляющие операторы работают как, например, 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)в C будет 4, а в C ++ - 1.
Фактический логический тип в 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чтобы понять код. Это целое число, указатель или символ?