Przypadek pierwszy: sprawdzany jest warunek pętli - jeżeli zmienna ct jest różna od zera, to warunek jest spełniony, następuje dekrementacja, wykonuje się ciało pętli. Jeżeli zmienna ct jest równa zero, to wyskakujemy z pętli i zmienna ct jest dekrementowana. Przypominam, że w C (no i konsekwentnie w C++) wartość zero jest traktowana jako false, inne wartości jako true.
Przypadek drugi: pętla ma niejako dwa warunki, jeden standardowy, i < n. Drugi natomiast sprawdza, czy znak spod indeksu jest różny od zera, czy równy zero (znak o kodzie zero = koniec C-stringa). Przykład wyjścia z takiej pętli: chcemy przejść po 10 znakach podanego wyrazu(pierwsza część warunku pętli dla n = 10). Jeżeli wyraz jest krótszy, to wyskoczymy z pętli dzięki && str[i] i nie będziemy przeglądać losowych bajtów z pamięci.
PS. Usuń ten kod HTML-a z bloczku z kodem, bo jest mylący.