Это не столько синтаксис языка, сколько общий способ преобразования char или int в квази-логическое значение.
В C логические операции, такие как == &&! и т. д. могут действовать на int, char и т. д., поскольку логического типа не существует, однако в соответствии со стандартом они гарантированно возвращают 0 для False и 1 для true.
Так, например, если у вас есть
int x = 5;
вы можете принудительно преобразовать его в "логический" тип (в C нет логического типа, следовательно, в кавычках), который вы делаете
x = !x; /* !5 which gives 0 always */
x = !x; /* which gives 1 always */