It has an added, important advantage: it allows you to examine program flow without interrupting it. Sometimes that's outright essential (e.g. you're debugging ISRs and breakpoints screw up everything; you can't printf from an ISR, obviously, but you can at least toggle some signal to examine on a logic analyser or flip a flag that you print back in the main loop); other times it's just easier to see where the difference between "what you wrote" and "what you think you wrote" is when you can follow the program's output as it's running, rather than through a sequence of breakpoints.