Você marcou sua pergunta [C] e [C ++] ao mesmo tempo. Os resultados serão consistentes entre os idiomas, mas a estrutura da resposta é diferente para cada um desses idiomas.
Na linguagem C, seus exemplos não têm relação boolalguma (isso também se aplica a C99). Na linguagem C, os operadores relacionais não produzem boolresultados. Ambas 4 > 5e 4 < 5são expressões que produzem resultados do tipo intcom valores 0ou1 . Portanto, não há nenhum tipo de "conversão de bool para int" ocorrendo nos seus exemplos em C.
No C ++, os operadores relacionais realmente produzem boolresultados. boolos valores são conversíveis em inttipo, com trueconversão para 1e falseconversão para0 . Isso é garantido pelo idioma.
A linguagem PS C também possui um tipo booleano dedicado _Bool(com alias de macro como bool) e suas regras de conversão integrais são essencialmente as mesmas que em C ++. Mas, no entanto, isso não é relevante para seus exemplos específicos em C. Mais uma vez, os operadores relacionais em C sempre produzem int(não bool) resultados, independentemente da versão da especificação da linguagem.
assert(x!=0). Mesmo que bool (true) converta portável em int (1), o "not false" afirma tem uma expressão mais legível.