Ambele variante sunt corecte.
while(y) se executa cat timp y este diferit de 0
Deci while(y) se poate inlocui cu while(y!= 0)
Iar while(! y) se poate inlocui cu while(! y!= 0) sau altfel spus while(y == 0).
O sa vezi si conditii cu if, switch case si for de genul asta :
if(y) - Returneaza false daca y este 0 si True pentru orice alta valoare diferita de 0
for(i=100; i; i--) Ruleaza de la i = 100 pana la i = 0, excluzand 0 (100, 99,98...1)