For scanf, you must get & in the right places.
Generally, compilers cannot check this.
At most a warning.
Extra arguments are just ignored.
Extra % specifications apply to junk following the arguments.
Extra % specifications in scanf use that junk as memory addresses.
Type mis-match can be very interesting.
Typically leads to run errors with opaque messages.
The gcc compiler writers have worked to aleviate some of these problems by giving warnings for bad printf calls. This requires the compiler to treat printf specially, which is a bit out of the spirit of the original C. Since it limits itself to warnings, it's not a violation of anything. If it did, it would probably be worth doing anyway.