p.s. this message is not 100% serious.
Good
because macro shenanigans are not in my list of acceptable programming habits.
Though somehow both are kind of tricks that tells me that a language structure is missing.
The "solution" (note the quotes) or, I should say, the best known one, is to allow assignments within expressions. That "solution", while at first seems like a good idea, it is Pandora's box (at least in C) because the immutability of the expression terms is neither guaranteed and, often not even obvious one way or the other.
Eny's suggestion is definitely good (that said, I don't see any reason to have "exit(n)" in there). Actually, now that you've re-stated it, I think it is a better solution than the one presented by
Martin_frIn spite of that, I'd still go with the "while true do" because all the information a programmer needs is right there. There is no need to look outside the "while" loop to figure out what controls it and how it is controlled.
IMO and experience, programs are much easier to understand and maintain when relationships among statements are grouped together.