Una precisione: la regola non è "scanf() restituisce 1 se ha successo"

Come si legge nella documentazione http://www.cplusplus.com/reference/cstdio/scanf/ :

On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.

Nel tuo caso è 1 ma non necessariamente lo è anche in altri casi