I słusznie, bo to kod-potwór. Aż się boję zapisywać i przepuszczać przez debugger, bo mi jeszcze kota zje… Więc zanalizuję ręcznie:
Zaczynamy, a = 1, b = 2, c = 3
.
Inicjalizacja pętli: wyświetla 1
(wartość a
), po czym inkrementuje a
. Teraz (a = 2, b = 2, c = 3
).
Następnie testowany jest warunek zakończenia pętli. Zewnętrzny printf
nam wyświetli dwie liczby, pierwszą z nich będzie wartość zwracana przez wewnętrznego printf
a — czyli liczba wypisanych znaków (lub kod błędu, jeśli się nie uda). Wewnętrzny printf
wyświetla wartość zmiennej b
— czyli 2, potem zewnętrzny wyświetli liczbę znaków w zapisie 2
— tzn. 1
— i zaraz po tym c * 10
, czyli 30
. Czyli wyświetlone zostanie na tym etapie, podsumujmy, 2130
. Zewnętrzny printf
wydrukował więc trzy znaki, trzy minus dwa to jeden, pętla leci dalej.
Dalej wykonuje się ciało pętli: a
jest zmniejszane o jeden, po czym c
jest ustawiane na to a
, tak więc teraz (a = 1, b = 2, c = 1
). Druga linia przypisuje do c
wartość c - 1
(vide supra), tak więc mamy (a = 1, b = 2, c = 0
).
Później mamy instrukcję po pętli, sumuje c
z a
i nie robi z tym nic; to tylko taka „zaciemniajka”.
I znowu warunek pętli: wewnętrzny printf
daje 2
, po czym zewnętrzny 10
, łącznie dwa znaki, dwa minus dwa to zero, koniec męki, idę się napić.