Thanks Miguel, that is indeed a very clear explanation !
These three variations on ``not precisely defined by the standard'' are defined as:
implementation-defined: The implementation must pick some behavior; it may not fail to compile the program. (The program using the construct is not incorrect.) The choice must be documented. The Standard may specify a set of allowable behaviors from which to choose, or it may impose no particular requirements.
unspecified: Like implementation-defined, except that the choice need not be documented.
undefined: Anything at all can happen; the Standard imposes no requirements. The program may fail to compile, or it may execute incorrectly (either crashing or silently generating incorrect results), or it may fortuitously do exactly what the programmer intended.
Note, too, that since the Standard imposes absolutely no requirements on the behavior of a compiler faced with an instance of undefined behavior, the compiler (more importantly, any generated code) can do absolutely anything. In particular, there is no guarantee that at most the undefined bit of the program will behave badly, and that the rest of the program will perform normally. It's perilous to think that you can tolerate undefined behavior in a program, imagining that its undefinedness can't hurt; the undefined behavior can be more undefined than you think it can.
In summary:
Undefined behavior should be avoided whenever you possibly can.
It really can make demons fly out of your nose.
Or make the compiler silently eat entire branches of your code without telling you.
Or other distressing things.
In his article about undefined behavior, Regehr mentions that there are 191 different kinds of undefined behavior in the C99 spec. Its not reasonable to expect all programmers to know every single one of those, and I assume the situation with C++ is even worse. So I hope the standards committee makes a serious effort to trim down the undefined behavior in the future.