Design first: You understand requirement first via analysis, create use cases for it. Thus, the focus is on the requirement before writing the code.
Good enough code for now: You write sufficient code against use cases that fulfills the user requirements. You don’t write extra lines of unnecessary code.
Avoid rework: Due to design first approach, most of the doubts are cleared before writing code hence rework is avoided.
Developer confidence: Continous delivery of requirement in small cycles gives developer a confidence.
Regression catching.
Safe Refactoring: Once the code is covered by multiple tests, a developer can safely improve code structure with confidence and can focus on simple and elegant design.
A shared understanding of the business: Tests are the live documentation that is the communication channel between you and your future version or other developers that talks about business rules.
Clean code reminder: IMO, TDD always reminds you to make your code better than you found it. Of course, after covering your code with test, make it better.