Désolé de jouer les rabat-joies, mais pour des raisons de lisibilité de votre code, je me permets de vous déconseiller très fortement les tests du genre :
if (!tete) ...
if (!n) ...
if (!object) ...
Préférez toujours :
if (object != NULL) ...
if (n != 0) ...
qui est mille fois plus clair à relire (au moins), et qui n'enlève absolument rien à l'efficacité du code généré par le compilateur.
La recommendation ci-dessus accepte une seule exception : quand l'expression que l'on teste est déjà de type booléen. Parce que justement, dans une condition, on doit trouver une expression booléenne (donc c'est inutile de comparer ce booléen avec un autre booléen pour obtenir... un booléen). Vous allez me dire, pour C, un booléen, c'est un int, mais ce n'est pas parce que C est un langage sémantiquement très pauvre qu'il faut rester à son niveau. On y gagne toujours en ajoutant de la sémantique. D'ailleurs, je vous conseille aussi de définir un type booléen si vous n'en avez aucun à votre disposition. En fait, un simple :
typedef int BOOL;
#define TRUE 1
#define FALSE 0
suffit très largement, et encore une fois, cela n'enlève rien à l'efficacité du code généré par le compilateur.