Earlier quoted context omitted.
However, this way your code enters an undefined state in C, strictly speaken. (as far as I unstand the standard) So theoretically, an extremely aggressive optimizer would be allowed to generate machine code that doesn't handle the case x==0 properly. If (x != 0) is placed first, the optimizer wouldn't be allowed to do that, due to short-circuit evaluation.
It's OK if x is of an unsigned integer type. If x is of a signed type, though, you're right: strictly, the value of x-1 is then undefined when x==0. (In practice, of course, it's perfectly safe unless you're on a distinctly exotic system, and if you are then you probably know you are.)
Why should x-1 for x==0 be undefined for a signed type? The signed type can happily represent -1. Rather, x-1 is undefined for unsigned types because those have no representation of -1.